嵌套在嵌套在其他数组中的数组的MongoDB更新对象,而不使用数组索引(嵌套更新)

时间:2016-04-27 16:07:16

标签: mongodb

我有以下文件:

{
  "_id" : ObjectId("5720bd01232ac527623f2889"),
  "planes" : [
      {
          "name" : "plane1",
          "wings" : [
              {
                  "name" : "rightDown"
              },
              {
                  "name" : "rightUp"
              }
          ]
      },
      {
          "name" : "plane2",
          "wings" : [
              {
                  "name" : "leftUp",
              },
              {
                  "name" : "leftDown",
              }
          ]
      }
  ]
}

我想更新嵌套在另一个数组中的数组中的对象,而不使用数组索引。 在我的例子中,'plane2'的属性'wing'名为'leftDown'。可能吗 ?

db.planes.update({
  planes: {
    $elemMatch: {
      wings: {
        $elemMatch: {
          name: 'leftUp'
        }
      }
    }
  }
}, 
// It would be wonderful if I the $set would look like this, 
// but the error is: 
// "Too many positional (i.e. '$') elements found in path 'planes.$.wings.$'"
//  
// It seems that $ holds only the value of the first nested 
// object in the array
{ 
  $set: {
    'planes.$.wings.$': {
        name: 'leftMagic'
    }
  }
})

MongoDb 3.2文档说: 位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$ placeholder的替换是单个值

但我还在等待那个奇迹...... 有没有其他干净/美丽的方式在一次拍摄中进行更新?

1 个答案:

答案 0 :(得分:1)

可悲的是,位置操作员只能持有一个值。我不认为您可以使用当前的数据结构一次性执行此更新。

您可以执行一次查找以获取第一个数组索引,然后执行第二次使用位置运算符,但此时您可以遍历数组并重新保存文档。

通过对您的馆藏进行一些重组,您可以将更新下载到单个操作中。查看MongooseJS populate