2013-03-28 183 views
2

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

例子:

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' 
       }] 
     } 
    ] 
} 
+0

+1,也可以使用一些帮助 –

回答

1

有没有办法做到这一点目前使用的定期更新操作你提到的原因。

您目前唯一可以使用的工作是将版本添加到您的文档中,并通过阅读文档,找到适当的元素在应用程序中修改它们的值,然后使用包括update的乐观锁(如果其他线程在您的查询和更新之间更新了文档,则不会覆盖更改,但必须重新加载文档并重试。

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