MongoDB 2.2-更新数组嵌套文档

MongoDB 2.2-更新数组嵌套文档,mongodb,Mongodb,是否可以使用$update和$elemMatch更新Level3数组中的单个文档字段?在这种情况下,我意识到我不能多次使用位置操作符,而且历史上,我对Level2嵌套文档进行了必要的更深入的修改,因为这些文档不是很大。我希望有一些语法可以使用$elemMatch更新Level3数组文档,而不知道目标文档在Level3数组中的位置,也不知道Level2中包含的文档 例如: db.collection.update({_id:'123', level2:{$elemMatch:{'level3.id

是否可以使用$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'
                }]
        }
    ]
}

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

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


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

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