MongoDB更新多个嵌套文档中的数组

时间:2016-09-13 20:16:19

标签: mongodb

我有以下

之类的藏品
{
   _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'}}}

任何人都可以提供帮助吗?

感谢您的光临。

1 个答案:

答案 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。这扇门将是另一个新系列。