【问题标题】:Return JSON with data from MongoDB使用来自 MongoDB 的数据返回 JSON
【发布时间】:2011-05-11 21:44:27
【问题描述】:

我从 MongoDB 获取数据如下:

@bs = coll2.find("date" => {"$gte" => initial_date, "$lte" => Time.now.utc})

它工作正常,但是当我渲染 @bs 时,它发送空。

  render :json => @bs

如果我执行@bs.each 并将每个都渲染为json,它可以工作,但是,我想发送整个@bs。

谢谢

【问题讨论】:

    标签: ruby-on-rails-3 mongodb mongodb-ruby


    【解决方案1】:

    默认情况下,#find 返回一个 Mongo::Cursor 对象,而不是实际结果。您需要先将 cursur (@bs) 转换为包含结果的数组,然后将其呈现为 json。

    render :json => @bs.to_a.to_json
    

    请注意,由于它是一个游标,一旦您返回结果或开始迭代它们,那么to_a 调用将不会返回所有结果。您需要调用 rewind! 来重置结果集:

    > @bs.to_a
    # => [{"_id" => BSON::ObjectID.....]
    > @bs.to_a
    # => []
    > @bs.rewind!
    # => true
    > @bs.to_a
    # => [{"_id" => BSON::ObjectID.....]
    

    【讨论】:

    • 谢谢,有道理。如何将光标转换为数组?有没有简单的方法?
    • 我的示例中的@bs.to_a 部分为您做到了这一点。然后你在数组上调用to_json来获取JSON数据。
    • 我仍然得到 [] 但@bs 正在返回结果。
    • 确保在to_a 调用之前你没有对@bs 做任何事情(即to_a 调用应该是你在运行find 之后对@bs 做的第一件事询问)。由于它是一个游标,因此执行@bs.each... 之类的操作会使它指向结果集的末尾。因此,当您执行 @bs.to_a 时,它会返回一个空数组。
    • 或者,您可以在to_a 之前调用@bs.rewind! 来重置结果集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    相关资源
    最近更新 更多