簡體   English   中英

迭代游標時修改Mongo對象的安全+有效方法?

[英]Safe+efficient way to modify Mongo objects while iterating over a cursor?

我有一些代碼檢查Mongo集合中的每個對象(迭代不帶參數的find()的結果),並對其中一些進行更改。 看起來這不安全:我的更改被保存,但是當我繼續迭代光標時,更改對象的子集(10-15%)會再次出現。 我沒有更改文檔ID或任何有索引的內容。

我想通過提前抓取所有文檔ID(將光標轉換為數組)來避免這個問題,但這些是大型集合,所以我真的想避免這種情況。

我注意到默認情況下find()的結果似乎沒有任何已定義的順序,所以我嘗試對游標進行顯式排序,{“_ id”:1}。 這似乎解決了這個問題 - 無論我修改什么,現在都沒有出現過兩次。 但我不知道這是不是一個好的/可靠的方法。 據我從文檔中可以看出,添加排序並不會使其預先查詢所有ID; 如果是這樣,那很好,但后來我不知道為什么它會解決這個問題。

改變東西時使用游標是一個壞主意嗎?

我正在使用Scala / Casbah,如果這很重要的話。

聽起來你想要的是快照查詢。 以下是有關如何執行此操作的更多信息:

http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database

考慮使用修改多個文檔的update命令: http//docs.mongodb.org/manual/tutorial/modify-documents/

此外,由於您只修改了某些對象,因此請考慮使用僅返回實際要修改的文檔而不是掃描整個集合的查詢。

迭代find和修改對象的結果可能看起來更方便和靈活,因為您不僅限於使用更新操作符可以執行的操作,並且您可以使用您選擇的語言編寫代碼來修改文檔。 但是,您描述的問題以及其他限制:

http://docs.mongodb.org/manual/faq/developers/#faq-developers-isolate-cursors

例如,快照查詢不是100%安全的,並且它們不能與分片集合一起使用,因此如果您以后決定分片,那么您的解決方案將會中斷。

如果您需要以更復雜的方式修改大量對象,可以使用map-reduce或聚合管道來解決您的問題:

http://docs.mongodb.org/manual/core/aggregation-pipeline/

http://docs.mongodb.org/manual/core/map-reduce/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM