Rails 中的原始 mongodb 查询

发布于 2024-11-03 11:37:14 字数 284 浏览 0 评论 0原文

我有一个 Rails/Mongoid 应用程序,它使用 highcharts 在客户端显示数据。现在,为了将数据传递给 Javascript,我在模板文件中使用 Mongoid 查询和 Rails 的 as_json/to_json 。这对我来说似乎效率很低,因为必须将 json 数据解析为 ruby​​ 结构,然后重新转换为 JSON。当数据量很少时,这没问题,但就我而言,数据量可能很大。

所以我的问题是,如何执行原始 mongodb 查询,并将输出直接写入 Rails 响应缓冲区,而不经过 Ruby JSON 序列化/反序列化?

I have a Rails/Mongoid app that displays data client-side using highcharts. Right now, to pass the data to Javascript, I use a Mongoid query and Rails' as_json/to_json in the template file. This seems very inefficient to me because the json data has to be parsed into ruby structures, and then re-converted to JSON. This is okay when there is a small amount of data, but in my case, there can be a lot.

So my question is, how can I do a raw mongodb query, and just write the output directly to the Rails response buffer without going through Ruby JSON serialization/deserialization?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等风来 2024-11-10 11:37:14

MongoDB中的数据存储在BSON中,而不是JSON。
ruby 驱动程序在 read_documents 方法中进行反序列化(BSON::BSON_CODER.deserialize)。如果您想推出自己的 BSON 到 JSON,则需要 BSON::BSON_coder.deserialize 的实现,并且可能需要在 mongo-ruby 驱动程序中重写更多部分。
但是,如果这是可以接受的开销,那么您只需继承 ActionController::Metal 并执行如下操作:

class ChartController < ActionController::Metal
  def chart
    res = fetch_data_from_mongodb
    self.content_type = 'application/json'
    self.response_body = res.to_json
  end
end

另一种替代方案可能是使用 MongoDB 的 REST HTTP 接口,提供 JSON。但是您必须在应用程序中进行一些访问控制,并且基本上是代理请求。

The data in MongoDB is stored in BSON, which is not JSON.
The ruby driver does deserialization (BSON::BSON_CODER.deserialize) in read_documents method. If you'd like to roll your own BSON-to-JSON, you'll need your implementation of BSON::BSON_coder.deserialize, and, probably, rewrite more parts in mongo-ruby driver.
If, however, this is a overhead that's acceptable, then you'll just subclass ActionController::Metal and do something like this:

class ChartController < ActionController::Metal
  def chart
    res = fetch_data_from_mongodb
    self.content_type = 'application/json'
    self.response_body = res.to_json
  end
end

Another alternative might be using the MongoDB's REST HTTP interface, which provides JSON. But you'll have to have some access control in your application, and, basically, proxy requests.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文