Mongo обновляет элемент массива и гоночных условий?

StackOverflow https://stackoverflow.com/questions/9436966

  •  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позиционныйАлоператор

Надеюсь, это даст вам представление о том, как ваше приложение может изменять значения в массиве без ссылки на их позицию. Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top