我有以下
之类的藏品{
_id: 1
rooms:[{
_id: 1,
doors: [{
_id: 1,
name: 'kitchen',
color: 'green'
},{
_id:2,
name: 'bathroom',
color: 'red'
}]
}]
}
我想通过id更新特定门的全部内容。
我尝试使用此代码但不起作用。
db.collections.update({_id:1, "rooms._id":1, "rooms.doors._id":2}, {$set: {rooms.$.doors.$: {_id:2, name: 'balcony', color:'yellow'}}}
如果我使用“rooms。$。doors.0”,它将始终更新数组中的第一扇门。
db.collections.update({_id:1, "rooms._id":1, "rooms.doors._id":2}, {$set: {rooms.$.doors.0: {_id:2, name: 'balcony', color:'yellow'}}}
任何人都可以提供帮助吗?
感谢您的光临。
答案 0 :(得分:0)
你应该尽量避免像这样嵌套多个数组。如果你想更新它太麻烦了。在mongodb的早期版本中,this guide仍然有效,显然不是最新版本的mongodb。只是为了好玩,如果你阅读指南,想象一下,我们需要多少$$来更新另一个嵌套数组。
您可以尝试聚合,但我认为将整个文档带有{_id:1}更容易添加到服务器,替换整个rooms_array并保存。
db.collections.find({_id:1}).exec((err, house)=>{
var rooms = house.rooms.map((r)=> {
return r.doors.map((d) => {
if(r._id === 1 && d._id === 2){
return {_id:2, name: 'balcony', color:'yellow'}
}
else{
return d
}
})
})
house.rooms = rooms
house.save()
})
替代方案,也许你可以为门做对象参考。而是另一个文档,只包括引用门的ObjectId。这扇门将是另一个新系列。