イベントの発生時に MongoDB データベースを更新しようとするパブリッシュ/サブスクライブ サーバーが複数あります。現在、特定の MongoDB ドキュメント配列にエントリをアトミックに追加する必要があるという問題に直面していますが、誰がエントリをドキュメントに追加するかに関して競合状態に陥っています。$addToSet
追加を行うために使用しようとしています。ただし、エントリが配列内にあると配列エントリが更新される可能性があるため、addToSet はエントリが配列内にあるかどうかを直接比較して確認するため、適切に機能することが難しくなります。以下に示す最終結果は、アレイに新しいエントリを追加する複数のサーバーを取得することです。
以下は、私が希望する完成したドキュメントの例です。
{
"_id" : ObjectId("522f99a622927d6d65b81dbd"),
"array" : [
{
"type" : "out",
"uuid" : "4f501517-1d10-48c2-91b7-0ca1bda80bd5",
"member_id" : "3847",
"join" : ISODate("2013-09-10T17:13:58.881Z")
}
],
"created" : ISODate("2013-09-10T17:13:58.437Z"),
"name" : "entry"
}
以下は、競合状態が原因で何が起こっているかの例です。
{
"_id" : ObjectId("522f99a622927d6d65b81dbd"),
"array" : [
{
"type" : "out",
"uuid" : "4f501517-1d10-48c2-91b7-0ca1bda80bd5",
"member_id" : "3847",
"join" : ISODate("2013-09-10T17:13:58.881Z")
},
{
"type" : "out",
"uuid" : "4f501517-1d10-48c2-91b7-0ca1bda80bd5",
"member_id" : "3847",
"join" : ISODate("2013-09-10T17:13:58.881Z")
}
],
"created" : ISODate("2013-09-10T17:13:58.437Z"),
"name" : "entry"
}
配列データをコレクションから完全に移動することなく、ドキュメント内の配列エントリをアトミックに追加/変更できた人はいますか? コレクションから移動することで、エントリに対して一意の制約を作成できることはわかっていますが、そうする必要はありません。