mongodb 复杂数据结构的分组求和 简书洛中
本文介绍了如何在MongoDB中使用聚合管道进行复杂数据结构的分组求和。
假设我们有以下样本数据:牛血
```。
"_id": 1,。
"name": "Alice",。
"orders": 。
{"product": "apple", "price": 2.99, "quantity": 5},。寿司卷
{"product": "banana", "price": 1.99, "quantity": 10},。
{"product": "orange", "price": 0.99, "quantity": 3}。
]。
},。
云南元谋人
"_id": 2,。
手提袋怎么做"name": "Bob",。
"orders": 。
{"product": "apple", "price": 2.99, "quantity": 3},。
{"product": "banana", "price": 1.99, "quantity": 7},。
{"product": "orange", "price": 0.99, "quantity": 2}。
]。
}。
```。
其中,每个文档表示一个顾客,包含"name"和"orders"字段。"orders"字段是一个数组,表示顾客的订单信息,包含"product"、"price"和"quantity"字段。
我们想要对每个顾客的订单进行分组求和,得到以下结果:
```。
"_id": 1,。
祝你前程似锦"name": "Alice",。
"total": 24.85。
},。
"_id": 2,。
"name": "Bob",。
"total": 17.92。
}。
```。
其中,"total"字段表示每个顾客的订单总价。
实现这个功能的聚合管道如下:
```。
db.customers.aggregate(。
{"$unwind": "$orders"},。
{"$group": 。
"_id": {"_id": "$_id", "name": "$name"},。
生命最后的读书会"total": {"$sum": {"$multiply": ["$orders.price", "$orders.quantity"]}}。
}},。
{"$project": 。
"_id": "$_id._id",。
"name": "$_id.name",。
"total": 1。简单的手工花
}}。
])。
```。
首先,使用"$unwind"操作将"orders"数组展开,变成多个文档,每个文档包含一个订单信息和相同的"name"和"_id"字段。
然后,使用"$group"操作将展开后的文档按照"name"和"_id"字段进行分组,然后对每组数据使用"$sum"操作求和。"$multiply"操作用于计算每个订单的总价。注意,"$sum"操作只能用于数字类型的数据,因此需要先进行乘法运算得到订单总价。
最后,使用"$project"操作将"_id"字段还原成原始的"_id",同时只保留"name"和"total"字段。