刚开始玩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分钟的服务器限制下?
答案 0 :(得分:2)
再次迭代游标意味着再次将查询发送到MongoDB。游标不会在本地存储所有查询结果。这将是非常低效的,并且可能导致不准确(例如,不反映最新的写入)。
通常使用分页,您可以使用跳过和限制为要显示的每个页面发出单独的查询(或新光标)。对此没什么好看的。在任何情况下,游标对象都不会在请求之间保持不变,因此您每次都必须创建一个全新的游标。