2013-06-05 60 views
0

我偶然發現了一個相當奇怪的問題。我的應用程序中有一個mongo集合,大約有4,800,000條記錄。我正在使用從該集合返回2 400 000條記錄的查詢。因此,我遍歷它們並在每條記錄上創建嵌入式文檔。當我查看我的日誌時,我注意到迭代發生了超過400萬次。我深入挖掘並發現,許多記錄多次進入迭代。這意味着具有相同ID的記錄在不止一次出現在日誌中進行處理。下面是查詢:Rails和mongoid返回查詢重複記錄

MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).all.each do |n|

很奇怪的是,那個時候我在鐵軌控制檯MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).count運行,我得到大約240萬的結果。 我在rails 3.2.13,mongoid 3.0.21和mongodb 2.4.0上運行。

回答

2

mongodb中的遊標默認爲latent。這意味着如果在處理光標時進一步寫入,那麼您可能會看到或不看到這些更新的結果。

由於更多數據被添加或現有數據被修改,對象可能會在集合中移動,這可能導致它們多次出現在遊標中(實際行爲未指定)。

您可以在查詢中使用傳遞mongoid snapshot選項來解決此問題。

(你也可以使用hint選項指定'_id' index。)

+0

是的,感謝的人,就是這樣。我修改了這樣的查詢:'MyModel.where({integer_array:{「$ not」=> {'$ size'=> 0}}})。hint(「_ id」=> 1).each do | n | ' – user2040438

+0

非常感謝你爲此嘗試調試類似問題的時間很長,但沒有這個答案 –