Mongo обновляет элемент массива и гоночных условий?
-
12-11-2019 - |
Вопрос
Я воображаю FOO делает обновление на третьем комментарии, comments.2.value
, в то время как Bar является $pull
-ing, удаляя первый комментарий.
Если Foo сначала заканчивается, то третий комментарий успешно обновляется, поскольку индекс до сих пор правильный.
Но если BAR сначала заканчивается, то индекс изменился, а FOO «GeneracodicCode» будет больше не влиять на третий комментарий.
Это возможно это сценарий, и если оно есть, мне интересно, есть ли общие решения для обновлений элементов массива и гоночного состояния?
Спасибо!
Решение
Ситуация, которую вы описали, теоретически возможны, если несколько приложений обращаются к базе данных одновременно. По этой причине лучше, если возможно, дать каждому члену массива некоторых уникальных идентификаторов, а не доступа к элементам в массиве по позиции.
Например,
> 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, но мы не обязательно знаем, что он появится вторым в массиве, мы можем обновить его так:
> 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 -% 24позиционныйАлоператор
Надеюсь, это даст вам представление о том, как ваше приложение может изменять значения в массиве без ссылки на их позицию. Удачи!