Ситуация, о которой вы описали, теоретически возможна, если несколько приложений одновременно обращаются к базе данных. По этой причине лучше всего, если возможно, предоставить каждому члену массива некоторый уникальный идентификатор, а не доступ к элементам в массиве по положению.
Например,
> 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"}
]})
Если мы хотим изменить комментарий Майка, но мы не обязательно знать, что он появится второй в массиве, мы можем обновить его следующим образом:
> 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"
}
]
}
Документальное запрос Wil l найти первое значение в массиве, которое соответствует, а «$» в документе обновления ссылается на эту позицию.
Дополнительную информацию о «$» -операторе можно найти в разделе «Оператор $ positional» в документации «Обновление». http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator
Надеюсь, это даст вам представление о том, как ваше приложение может изменять значения в массиве без ссылки на их позицию. Удачи!
Удивительно! Теперь я снова могу хорошо спать. Интересно, что вы подразумеваете под «теоретически возможным, если несколько приложений одновременно обращаются к базе данных», так как в моем случае у меня есть только одно приложение, но с несколькими одновременными пользователями. – bertie