0

MongoDB でこれを行うための同時実行に適した方法はありますか:

フィールドでソートされた最後のドキュメントが別のフィールドに異なる値を持つ場合にのみ、ドキュメントを挿入したいと考えています。目標は、すべての生の値ではなく、遷移のみを格納するコレクションを持つことです。

例 :

これがコレクションです(人間にわかりやすいタイムスタンプ付き):

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 3000, "status" : "HEALTHY" }

次に、新しいステータスを受け取ったとしましょうA:

{ timestamp: 9999, "status": "HEALTHY" }

の場合A、トランジションがないstatusので、コレクションを更新して次のようにしたいと思います。

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 9999, "status" : "HEALTHY" }

ただし、次のような新しいステータスを受け取った場合B:

{ timestamp: 9999, "status": "ILL" }

status新しいトランジションを登録し、新しいドキュメントをコレクションに保存したいと考えてBstatusます。timestamp === 3000status === "HEALTHY"

コレクションは次のようになります。

{ "created" : 1000, "lastUpdate" : 1000, "status" : "HEALTHY" }
{ "created" : 2000, "lastUpdate" : 2000, "status" : "ILL" }
{ "created" : 3000, "lastUpdate" : 3000, "status" : "HEALTHY" }
{ "created" : 9999, "lastUpdate" : 9999, "status" : "ILL" }

私が考えることができるのは、findOne最近更新されたドキュメントを取得するために を作成し、その後に取得したドキュメントと新しく受信したオブジェクトのメモリ内比較に応じてupdateorを作成することだけです。しかし、別のプロセスが私と私の間に別のドキュメントを挿入する可能性があるため、これは同時実行に適していません...insertfindinsert/update

これを可能にする可能性のある、私が気付いていないパターンまたはmongo機能はありますか?

4

1 に答える 1

0

ドキュメントを挿入または更新し、MMAP Storage Engine を有効にしている場合は、コレクション レベルのロックがあるため、このシナリオでは安全です。ただし、wiredtiger ストレージ エンジンを有効にしている場合、このアプローチは失敗します。

于 2015-09-23T16:31:36.777 に答える