使用ruby迭代Mongo游标不止一次

时间:2012-04-03 08:26:24

标签: ruby mongodb

刚开始玩MongoDB。

irb(main):037:0> @db.insert({"color" => "Blue"})
=> BSON::ObjectId('4f7aaf3a1d41c81634000002')

现在我尝试使用find方法,使用find_one:

irb(main):039:0> @results = @db.find({"color" => "Blue"})
=> <Mongo::Cursor:0x4340c48 namespace='tutorial.users' @selector={"color"=>"Blue"} @cursor_id=>

现在我尝试迭代结果:

irb(main):040:0> @results.each do |aa|
irb(main):041:1* puts aa["color"]
irb(main):042:1> end
Blue
=> nil

当我再次运行时,没有任何显示

irb(main):043:0> @results.each do |aa|
irb(main):044:1* puts aa["color"]
irb(main):045:1> end
=> nil

Is it possible to iterate a mongo cursor twice?

上面的帖子说,我必须使用倒带! ruby类中的方法。

让我们看看:

irb(main):046:0> @results.rewind!
=> true
irb(main):047:0> @results.each do |aa|
irb(main):048:1* puts aa["color"]
irb(main):049:1> end
Blue
=> nil

为什么光标只适合一次运行?

如果我正在使用ruby驱动程序直接构建rails应用程序,并尝试分页,第二个人按下后退按钮,没有任何工作。

还有其他选择,但它看起来像是黑客。

我在10分钟的限制内阅读,但这似乎只适用于一次?

这里发生了什么,为什么我不能再次迭代它,至少在10分钟的服务器限制下?

1 个答案:

答案 0 :(得分:2)

再次迭代游标意味着再次将查询发送到MongoDB。游标不会在本地存储所有查询结果。这将是非常低效的,并且可能导致不准确(例如,不反映最新的写入)。

通常使用分页,您可以使用跳过和限制为要显示的每个页面发出单独的查询(或新光标)。对此没什么好看的。在任何情况下,游标对象都不会在请求之间保持不变,因此您每次都必须创建一个全新的游标。