1

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 ドライバーを使用した経験的なテストでは、負荷が高いと全体的にはるかに遅くなるように見えるため、使用したくありません。

4

2 に答える 2

3

MongoDB では、更新はアトミックです。ドキュメントを取り戻す必要がない場合は、findAndModify を使用する必要はありません。

あなたが与えるシナリオでは、期待されることが起こります.最初のケースでは評判は5になり、2番目のケースでは4になります.

あなたの場合、1回の更新でactiveUserが正常に設定されます。

これは、MongoDB でのアトミック操作について説明しているリンクです。

于 2012-06-09T06:50:55.933 に答える
0

このようなシナリオでは、 を使用する必要がありますfindAndModify。完全にアトミックです。

このようなもの:

db.runCommand({findAndModify: 'myCollection',
               query: {_id: "doc_id", activeUser: {$exists: false}},
               update: {$set: {activeUser: "Zugwalt"}}})
于 2012-06-09T00:11:22.963 に答える