[英]MongoDB Aggregation - How to get/update sum
例如,我的数据库中有一些东西,比如客户集合。
{
Max: {
shoping_list: {
food: { Pizza: 2, Ramen: 1, Sushi: 5 }
}
},
John: {
shoping_list: {
food: { Pizza: 2, Ramen: 1, Burger: 1 }
}
}
}
在我的后端,我想得到食物的总和
const request = await customers.aggregate([
{
$group: {
_id: null,
Pizza: {
$sum: '$shoping_list.food.Pizza',
},
有没有一种方法可以自动更新或获取总和,而无需手动写入shopping_list
中的每一种食物?
文档的设计可能导致查询看起来很复杂但仍然可以实现。
$replaceRoot
- 用新文档替换输入文档。
1.1. $reduce
- 迭代数组并将其转换为新形式(数组)。
1.2. input
- 将当前文档$$ROOT
的键值对转换为对象数组,例如: [{ k: "", v: "" }]
1.3. initialValue
- 使用空数组初始化值。 这将导致数组中的 output。
1.4. in
1.4.1. $concatArrays
- 将聚合数组结果 ( $$value
) 与1.4.2组合。
1.4.2. 使用$cond
运算符过滤掉带有{ k: "_id" }
的文档,然后我们通过$objectToArray
objectToArray 将当前迭代对象的v
shoping_list.food
转换为数组。
$unwind
- 将foods
数组解构为多个文档。
$group
- 按foods.k
并为foods.v
。
db.collection.aggregate([
{
$replaceRoot: {
newRoot: {
foods: {
$reduce: {
input: {
$objectToArray: "$$ROOT"
},
initialValue: [],
in: {
$concatArrays: [
"$$value",
{
$cond: {
if: {
$ne: [
"$$this.k",
"_id"
]
},
then: {
$objectToArray: "$$this.v.shoping_list.food"
},
else: []
}
}
]
}
}
}
}
}
},
{
$unwind: "$foods"
},
{
$group: {
_id: "$foods.k",
sum: {
$sum: "$foods.v"
}
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.