考虑以下聚合管道输出的文档:
{ "_id" : 1, "results" : [
{ "status" : "HOLD", "footage" : 43.01, "pieces" : 1 },
{ "status" : "ACCEPTED", "footage" : 80.90, "pieces" : 2 },
{ "status" : "REJECTED", "footage" : 40.00, "pieces" : 1 }
]}
我正在尝试创建自定义键,将状态与素材和片段字段连接起来,从而产生:
{ "_id" : 1, "results" :
{
"HOLD_footage": 43.01,
"HOLD_pieces":1,
"ACCEPTED_footage": 80.90,
"ACCEPTED_pieces": 2,
"REJECTED_footage":40.00,
"REJECTED_pieces":1
}
}
您可以执行以下操作:
$map
使用您想要的键构建 k-v 元组(即 HOLD_footage...)$concatArrays
对 k-v 元组数组进行分组$objectToArray
获取您期望的数组形式db.collection.aggregate([
{
"$addFields": {
"results": {
"$map": {
"input": "$results",
"as": "r",
"in": [
{
k: {
$concat: [
"$$r.status",
"_footage"
]
},
v: "$$r.footage"
},
{
k: {
$concat: [
"$$r.status",
"_pieces"
]
},
v: "$$r.pieces"
}
]
}
}
}
},
{
"$addFields": {
"results": {
"$reduce": {
"input": "$results",
"initialValue": [],
"in": {
"$concatArrays": [
"$$value",
"$$this"
]
}
}
}
}
},
{
"$addFields": {
"results": {
"$arrayToObject": "$results"
}
}
}
])