我想使用$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
有什么想法可以达到我的预期目标吗?
答案 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"
}
])