複数のアプリケーションが同時にデータベースにアクセスしている場合、説明した状況は理論的には可能です。このため、可能であれば、配列内の要素に位置でアクセスするのではなく、配列の各メンバーに一意の識別子を付与することをお勧めします。
例えば、
> 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
これにより、アプリケーションが位置を参照せずに配列内の値を変更する方法を理解できると思います。幸運を!