Mongo使用$ set添加新字段来复制嵌套数组对象的值

时间:2020-02-23 13:07:03

标签: mongodb

我想使用$set将嵌套在对象数组中的值复制到每个对象,但不是复制该单个值,而是将所有元素投影到数组中。这是我尝试过的:

db.things.insertOne(
  {
    name: 'first',
    items: [
      { value: 1 },
      { value: 2 }
    ]
  }
)
db.things.updateMany(
  {},
  [
    {"$set": {"items.value_copy": "$items.value"}}
  ]
)

结果:

{
  "_id": {
    "$oid": "5e527707f3ae2e9f7adb6e1c"
  },
  "name": "first",
  "items": [
    {
      "value": 1,
      "value_copy": [
        1,
        2
      ]
    },
    {
      "value": 2,
      "value_copy": [
        1,
        2
      ]
    }
  ]
}

预期结果:

{
  "_id": {
    "$oid": "5e527707f3ae2e9f7adb6e1c"
  },
  "name": "first",
  "items": [
    {
      "value": 1,
      "value_copy": 1
    },
    {
      "value": 2,
      "value_copy": 2
    }
  ]
}
db.version();

4.2.3

有什么想法可以达到我的预期目标吗?

2 个答案:

答案 0 :(得分:2)

该问题是因为$items.value将从所有文档中获取items.values处的值列表。您可以在更新操作中使用聚合管道,该操作在MongoDB v 4.2中引入,用于重写整个items数组,并在每个对象中添加新字段:

db.thingsNew.update({}, [{
    $set: {
        items: {
            $map: {
                input: "$items",
                as : 'each',
                in: {
                    "value": "$$each.value",
                    "value_copy": "$$each.value"
                }
            }
        }
    }
}], { multi: true })

答案 1 :(得分:0)

不可能

遍历。我们将MongoDb聚合与$map配合使用来添加value_copy字段和$out运算符来覆盖集合。

db.things.aggregate([
  {
    $set: {
      items: {
        $map: {
          input: "$items",
          in: {
            "value": "$$this.value",
            "value_copy": "$$this.value"
          }
        }
      }
    }
  },
  {
    $out: "things"
  }
])