我认为您需要更改架构,您正在将数据保存在键中。
MongoDB 运算符不会具有未知的键,例如,我们无法按未知的键进行分组。为了做到这一点,我们会执行复杂且缓慢的操作,例如$objectToArray
.
您想要作为结果的数据也有同样的问题。
如果你只看中间的查询$unwind
and $group
将需要它,具有更改的架构,并要求键中没有数据的数据。
我的意思是代替
items_array: {
"item_1": 1,
"item_2": 2,
"item_3": 1,
"item_4": 1
}
您的集合应该类似于(查询的第一部分会更改您的架构)
items_array: [
{"name" "item_1",
"qty" : 1},
{"name" "item_2",
"qty" : 2},
{"name" "item_3",
"qty" : 1},
{"name" "item_4",
"qty" : 1}
]
此外,结果应该只有已知的键。
也许你陷入困境的原因是。你会让事情变得更容易。
测试代码在这里 https://mongoplayground.net/p/aCiHmzu-dpa
Query(查询适用于您的模式,但我告诉您我的想法)
db.collection.aggregate([
{
"$addFields": {
"items_array": {
"$map": {
"input": {
"$map": {
"input": {
"$objectToArray": "$items_array"
},
"as": "m",
"in": [
"$$m.k",
"$$m.v"
]
}
},
"as": "item",
"in": {
"name": {
"$arrayElemAt": [
"$$item",
0
]
},
"qty": {
"$arrayElemAt": [
"$$item",
1
]
}
}
}
}
}
},
{
"$unwind": {
"path": "$items_array"
}
},
{
"$group": {
"_id": "$items_array.name",
"total-qty": {
"$sum": "$items_array.qty"
}
}
},
{
"$group": {
"_id": null,
"items_array": {
"$push": {
"$map": {
"input": {
"$map": {
"input": {
"$objectToArray": "$$ROOT"
},
"as": "m",
"in": [
"$$m.k",
"$$m.v"
]
}
},
"as": "i",
"in": {
"$arrayElemAt": [
"$$i",
1
]
}
}
}
}
}
},
{
"$project": {
"_id": 0
}
},
{
"$addFields": {
"items_array": {
"$arrayToObject": "$items_array"
}
}
}
])