0

イベントの発生時に 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"
}

配列データをコレクションから完全に移動することなく、ドキュメント内の配列エントリをアトミックに追加/変更できた人はいますか? コレクションから移動することで、エントリに対して一意の制約を作成できることはわかっていますが、そうする必要はありません。

4

1 に答える 1

0

残念ながら、配列を独自のコレクションに移動して、uuid に対して一意の制約を適用する必要があります。これにより、同じ uuid での挿入が失敗します。それを提供するための機能リクエストがあり、 https ://jira.mongodb.org/browse/SERVER-1068 で確認できます。

他にご不明な点がございましたら、お気軽にお問い合わせください。

ベスト、チャーリー

于 2013-09-13T18:44:17.633 に答える