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
新しいトランジションを登録し、新しいドキュメントをコレクションに保存したいと考えてB
いstatus
ます。timestamp === 3000
status === "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
最近更新されたドキュメントを取得するために を作成し、その後に取得したドキュメントと新しく受信したオブジェクトのメモリ内比較に応じてupdate
orを作成することだけです。しかし、別のプロセスが私と私の間に別のドキュメントを挿入する可能性があるため、これは同時実行に適していません...insert
find
insert/update
これを可能にする可能性のある、私が気付いていないパターンまたはmongo機能はありますか?