【问题标题】:MongoDB 2.2 - Updating Array Nested DocumentMongoDB 2.2 - 更新数组嵌套文档
【发布时间】:2013-03-19 12:48:41
【问题描述】:

是否可以使用 $update 和 $elemMatch 更新 Level3 数组中的单个文档字段?我意识到在这种情况下我不能多次使用位置运算符,并且从历史上看,我已经修改了 Level2 嵌套文档,并进行了所需的更深层次的更改,因为这些文档不是很大。我希望有一些语法可以使用 $elemMatch 更新 Level3 数组文档,而无需知道目标文档在 Level3 数组中的位置或在 Level2 中包含文档。

例子:

db.collection.update({_id:'123', level2:{$elemMatch:{'level3.id':'bbb','level3.e1':'hij'}},{'level2.level3.createdDate':new Date()})

{
    _id:'123',
    f1:'abc',
    f2:'def',
    level2:[
        {_
            id:'aaa',
            e1:'hij',
            e2:'lmo'
            level3:[
                {
                    name:'foo',
                    type:'bar',
                    createdDate:'2013-3-28T05:18:00'
                }]
        },
        {_
            id:'bbb',
            e1:'hij',
            e2:'lmo'
            level3:[
                {
                    name:'foo2',
                    type:'bar2',
                    createdDate:'2013-3-28T05:19:00'
                }]
        }
    ]
}

【问题讨论】:

  • +1,也可以在这方面使用一些帮助

标签: mongodb


【解决方案1】:

由于您提到的原因,目前无法使用常规更新操作来执行此操作。

目前唯一可以使用的解决方法是向文档添​​加版本控制,并通过阅读文档来使用乐观锁定,在应用程序中找到要修改的适当元素,更改它们的值,然后使用update在读取的文档中包含版本(这样如果其他线程在您的查询和更新之间更新了文档,您就不会覆盖更改,但必须重新加载文档并重试。

版本控制策略不必基于整个文档,您可以对第一级数组元素进行版本控制,然后您就可以只更新您关注的子数组(通过使用 $set 进行更新) .

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2016-11-23
    • 2017-06-05
    • 2015-07-13
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多