2013-03-28 245 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的更新)。