0

私は、 fooが3番目のコメントを更新していると想像していますがcomments.2.valuebar$pull-ingで、最初のコメントを削除しています。

fooが最初に終了した場合、インデックスはまだ正しいため、3番目のコメントは正常に更新されます。

しかし、バーが最初に終了した場合、インデックスは変更され、fooは3番目のcomments.2.valueコメントには影響しなくなります。

このシナリオは可能ですか?可能であれば、配列要素の更新と競合状態の一般的な解決策があるかどうか疑問に思いますか?

ありがとうございました !

4

1 に答える 1

3

複数のアプリケーションが同時にデータベースにアクセスしている場合、説明した状況は理論的には可能です。このため、可能であれば、配列内の要素に位置でアクセスするのではなく、配列の各メンバーに一意の識別子を付与することをお勧めします。

例えば、

> db.myComments.save({_id:1,
comments:[
{cid:1, author:"Marc", comment:"Marc's Comment"}, 
{cid:2, author:"Mike", comment:"Mike's Comment"}, 
{cid:3, author:"Barrie", comment:"Barrie's Comment"}
]})

Mike の Comment を変更したいが、それが配列の 2 番目に表示されるかどうかわからない場合は、次のように更新できます。

> db.myComments.update({_id:1, "comments.cid":2}, {$set:{"comments.$.comment":"Mike's NEW Comment"}})
> db.myComments.find().pretty()
{
    "_id" : 1,
    "comments" : [
        {
            "cid" : 1,
            "author" : "Marc",
            "comment" : "Marc's Comment"
        },
        {
            "author" : "Mike",
            "cid" : 2,
            "comment" : "Mike's NEW Comment"
        },
        {
            "cid" : 3,
            "author" : "Barrie",
            "comment" : "Barrie's Comment"
        }
    ]
}

次のように、サブドキュメント全体を変更することもできます。

> db.myComments.update({_id:1, "comments.cid":2}, {$set:{"comments.$":{cid:4, author:"someone else", comment:"A completely new comment!"}}})
> db.myComments.find().pretty()
{
    "_id" : 1,
    "comments" : [
        {
            "cid" : 1,
            "author" : "Marc",
            "comment" : "Marc's Comment"
        },
        {
            "cid" : 4,
            "author" : "someone else",
            "comment" : "A completely new comment!"
        },
        {
            "cid" : 3,
            "author" : "Barrie",
            "comment" : "Barrie's Comment"
        }
    ]
}

クエリ ドキュメントは、一致する配列内の最初の値を見つけ、更新ドキュメント内の「$」はその位置を参照します。

「$」演算子の詳細については、「更新」ドキュメントの「$ 位置演算子」セクションを参照してください。 http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

これにより、アプリケーションが位置を参照せずに配列内の値を変更する方法を理解できると思います。幸運を!

于 2012-02-24T20:14:20.457 に答える