我正在编写一个 mongodb 聚合管道。 我的文件格式如下:
{
name: "01"
tags {
tag_01: {
a: "a01-val",
b: "b01-val"
},
tag_02: {
a: "a02-val",
b: "b02-val"
}
}
},
{
name: "02"
tags {
tag_03: {
a: "a03-val",
b: "b03-val"
},
tag_04: {
a: "a04-val",
b: "b04-val"
}
}
}
我的管道应生成如下文档:
{
name: "01"
tags {
tag_01: {
a: "a01-val",
b: "b01-val",
tagName: "tag_01"
},
tag_02: {
a: "a02-val",
b: "b02-val",
tagName: "tag_02"
}
}
},
{
name: "02"
tags {
tag_03: {
a: "a03-val",
b: "b03-val",
tagName: "tag_03"
},
tag_04: {
a: "a04-val",
b: "b04-val",
tagName: "tag_04"
}
}
}
换句话说,每个子文档中都会添加一个新字段,其值为父字段的名称。 可以这样做吗?
使用
$objectToArray
将 tags
转换为 k-v 元组数组。使用 $map
迭代数组元素,并使用 $mergeObjects
使用 k
设置字段。然后使用 $arrayToObject
恢复到原始对象形式。
db.collection.update({},
[
{
"$set": {
"tags": {
"$objectToArray": "$tags"
}
}
},
{
"$set": {
"tags": {
"$map": {
"input": "$tags",
"as": "tag",
"in": {
k: "$$tag.k",
v: {
"$mergeObjects": [
"$$tag.v",
{
"tagName": "$$tag.k"
}
]
}
}
}
}
}
},
{
$set: {
tags: {
"$arrayToObject": "$tags"
}
}
}
],
{
multi: true
})