MongoDB Updateのドキュメントから、彼らは更新オペレーターがアトミックであることについて語っています。以下のクエリが同じ瞬間に 5 回呼び出され、Zugwalt の評価が 0 から始まる場合、最後に評価が 5 になると予想します。
db.rep.update({_id: "Zugwalt"}, {$inc: {reputation: 1}});
しかし、更新クエリがこれだとどうなるでしょうか?
db.rep.update({_id: "Zugwalt", reputation: {$lte: 3}}, {$inc: {reputation: 1}});
レピュテーションは常に 3 回しか更新されないのでしょうか、それともそれ以上になる可能性のある奇妙な競合状態があるのでしょうか?
私の特定のケースは、アクティブなユーザーを使用して「ドキュメントを主張する」ことです。次のようなクエリを実行します。
db.myCollection.update({_id: "doc_id", activeUser: {$exists: false}}, {$set: {activeUser: "Zugwalt"}});
理想的には、このクエリが同じインスタンスで複数回発生する場合、1 回の更新だけでコレクションが変更されます。ただし、検索コンポーネントが更新でアトミックでない場合、最初に更新されて activeUser をあるユーザーに設定し、次にすぐに別のユーザーに設定するという競合状態が発生する可能性があります。
補足: findAndModifyコマンドがこの種のアトミック性を持っていることはより明確に見えますが、node-js ドライバーを使用した経験的なテストでは、負荷が高いと全体的にはるかに遅くなるように見えるため、使用したくありません。