findAndModify
MongoDBのメソッドに少し混乱しています。update
メソッドに対する利点は何ですか?私にとっては、最初にアイテムを返してから更新するだけのようです。しかし、なぜ最初に商品を返品する必要があるのですか? MongoDB: the definitive guideを読んだところ、キューを操作したり、get-and-set スタイルの原子性を必要とするその他の操作を実行したりするのに便利であると書かれています。しかし、それがどのようにこれを達成するのか理解できませんでした。誰かが私にこれを説明できますか?
6 に答える
アイテムをフェッチしてから更新すると、これら 2 つのステップの間に別のスレッドによる更新が発生する可能性があります。最初にアイテムを更新してからフェッチすると、その間に別の更新が行われる可能性があり、更新したものとは異なるアイテムが返されます。
「アトミックに」行うということは、更新しているアイテムとまったく同じアイテムが返されることが保証されることを意味します。つまり、その間に他の操作が発生することはありません。
findAndModify
はドキュメントを返しますが、update は返しません。
Dwight Merriman (mongoDB の元の作成者の 1 人) を正しく理解していれば、 update を使用して単一のドキュメント ie("multi":false} を変更することもアトミックです。現在、findAndModify
.
MongoDB ドキュメントから(強調を追加):
デフォルトでは、両方の操作で 1 つのドキュメントが変更されます。ただし、multi オプションを指定した update() メソッドは、複数のドキュメントを変更できます。
複数の文書が更新条件に一致する場合、findAndModify() に対して、更新する文書をある程度制御するための並べ替えを指定できます。update() メソッドのデフォルトの動作では、複数のドキュメントが一致する場合に、どのドキュメントを更新するかを指定できません。
デフォルトでは、findAndModify() メソッドはドキュメントの変更前のバージョンを返します。更新されたドキュメントを取得するには、新しいオプションを使用します。update() メソッドは、操作のステータスを含む WriteResult オブジェクトを返します。更新されたドキュメントを返すには、find() メソッドを使用します。ただし、他の更新により、更新とドキュメントの取得の間にドキュメントが変更された可能性があります。また、更新によって 1 つのドキュメントのみが変更され、複数のドキュメントが一致した場合は、更新されたドキュメントを識別するために追加のロジックを使用する必要があります。
MongoDB 3.2 より前では、書き込みに関する懸念を findAndModify() に指定してデフォルトの書き込みに関する懸念をオーバーライドすることはできませんでしたが、MongoDB 2.6 以降では update() メソッドに書き込みに関する懸念を指定できました。
1 つのドキュメントを変更する場合、findAndModify() メソッドと update() メソッドの両方がドキュメントをアトミックに更新します。
ユース ケースの有用なクラスの 1 つは、カウンターおよび類似のケースです。たとえば、次のコード (MongoDB テストの 1 つ) を見てください: find_and_modify4.js。
したがって、findAndModify
カウンターをインクリメントし、インクリメントされた値を 1 ステップで取得します。比較: あなた (A) がこの操作を 2 つのステップで実行し、他の誰か (B) があなたのステップ間で同じ操作を行う場合、A と B は 2 つの異なるカウンター値ではなく、同じ最後のカウンター値を取得する可能性があります (考えられる問題の一例にすぎません)。