使用.aggregate()
方法.
从版本3.2开始,您可以使用阶段中的$sum
累加器运算符$project
来计算并返回数组的总和quantity * price
.当然要获得阵列,您需要使用$map
运算符.该$ifNull
运算符计算"量"和"价"的值,然后返回0
,如果他们评价为空值.管道中的最后一个阶段是$group
您按"数字"对文档进行分组并为每个组返回"总计"的阶段.
db.collection.aggregate([
{ "$project": {
"number": 1,
"total": {
"$sum": {
"$map": {
"input": "$rows",
"as": "row",
"in": { "$multiply": [
{ "$ifNull": [ "$$row.quantity", 0 ] },
{ "$ifNull": [ "$$row.price", 0 ] }
]}
}
}
}
}},
{ "$group": {
"_id": "$number",
"total": { "$sum": "$total" }
}}
])
如果您不是3.2版,则需要$project
使用$unwind
运算符在阶段之前对"rows"数组进行非规范化.
db.collection.aggregate([
{ "$unwind": "$rows" },
{ "$project": {
"number": 1,
"value": { "$multiply": [
{ "$ifNull": [ "$rows.quantity", 0 ] },
{ "$ifNull": [ "$rows.price", 0 ] }
]}
}},
{ "$group": {
"_id": "$number",
"total": { "$sum": "$value" }
}}
])