我想象 foo 在第三条评论,comments.2.value上做更新,而 bar 是生成的,删除第一个注释。

如果首先完成 foo 完成第三条评论成功更新,因为索引仍然是正确的。

但如果首先完成,则索引已更改,并且 foo $pull会不会影响第三条评论。

是这种情况可能的,如果是,我想知道是否有阵列元素更新和赛车条件的常见解决方案?

谢谢!

有帮助吗?

解决方案

如果多个应用程序同时访问数据库,则理论上可能描述的情况。因此,最好是,如果可能的话,要为数组提供一些唯一标识符,而不是按位置访问数组中的元素。

例如,

> 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#pupdating -the%24为例

希望这将为您了解您的应用程序如何在某个阵列中修改值,而不引用其位置。祝你好运!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top