8

Mongo コレクション内のすべてのオブジェクトを調べ (パラメータなしで find() の結果を反復処理)、それらのいくつかに変更を加えるコードがいくつかあります。これを行うのは安全ではないようです。変更は保存されますが、カーソルを反復処理し続けると、変更されたオブジェクトのサブセット (10 ~ 15%) が 2 回目に表示されます。ドキュメント ID やインデックスがあるものは変更していません。

事前にすべてのドキュメント ID を取得する (カーソルを配列に変換する) ことでこの問題を回避できると思いますが、これらは大きなコレクションなので、避けたいと思います。

デフォルトでは、find() の結果に順序が定義されていないように見えることに気付いたので、カーソル {"_id":1} に明示的な並べ替えを設定してみました。これで問題は解決したようです。何を変更しても、何も表示されなくなりました。しかし、それが良い/信頼できるアプローチであるかどうかはわかりません。ドキュメントからわかる限り、並べ替えを追加しても、すべての ID を事前にクエリするわけではありません。もしそうなら、それはいいことですが、なぜそれが問題を解決するのかわかりません。

変更中にカーソルを使用するのは悪い考えですか?

問題があれば、私は Scala/Cas​​bah を使用しています。

4

2 に答える 2

8

あなたが望むのはスナップショットクエリのようです。これを行う方法の詳細は次のとおりです。

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

于 2012-04-17T21:58:56.447 に答える
1

update複数のドキュメントを変更 するコマンドの使用を検討してください: http://docs.mongodb.org/manual/tutorial/modify-documents/

また、一部のオブジェクトのみを変更するため、コレクション全体をスキャンするのではなく、実際に変更しようとしているドキュメントのみを返すクエリを使用することを検討してください。

a の結果を反復処理して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/

于 2014-08-01T09:28:57.163 に答える