是否可以使用$ 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'
}]
}
]
}
答案 0 :(得分:1)
由于您提到的原因,目前无法使用常规更新操作执行此操作。
目前唯一可以使用的工作是在文档中添加版本控制,并通过阅读文档,在应用程序中找到要修改的相应元素,更改其值,然后使用{{1}来使用乐观锁定包括读取文档中的版本(如果其他线程在您的查询和更新之间更新了文档,则不会覆盖更改,但必须重新加载文档并重试。
版本控制策略不必基于整个文档,您可以对第一级数组元素进行版本控制,然后您就可以只更新您关注的子数组(通过$ set更新)