2012-04-03 42 views
1

剛剛開始玩MongoDB。使用ruby不止一次地遍歷Mongo遊標

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 driver直接創建rails應用程序,並嘗試分頁,第二個人點擊後退按鈕,沒有任何工作。

還有其他的選擇,但它看起來像一個黑客。

我讀了10分鐘的限制,但這似乎只適用於一個用途?

這裏發生了什麼,爲什麼我不能再次迭代它,至少在10分鐘的服務器限制下?

回答

2

要再次遍歷遊標意味着再次發送查詢到MongoDB。遊標不會在本地存儲所有查詢結果。這將是非常低效的,並可能導致不準確(例如,不反映最新的寫入)。

通常,在使用分頁的情況下,使用跳過和限制爲每個要顯示的頁面發出單獨的查詢(或新光標)。對此沒有任何不滿。在任何情況下,遊標對象都不會在請求之間持續存在,所以每次都必須創建一個全新的遊標。

+0

我明白了。我正在閱讀文檔和api文檔以最好地理解整個圖片。現在,我必須手動添加限制並跳過語句到我的遊標對象? 某處我讀到「下一個」可能有助於嘗試分頁。 此外,我必須使用像MongoMapper/Mongoid來創建一個Rails應用程序。我只是想看看我能夠使用簡單的Ruby驅動程序,因爲它看起來更「簡單」。 – BriteLite 2012-04-03 17:34:57