我有一个包含包的数据模型,每个包都有一组产品文档。 每个产品文档都有一个价格和一个 isTaxable:boolean 字段
我可以在获取每个包裹 (product.price $sum) 的小计时进行汇总,但我无法弄清楚如何“同时”在同一汇总中获取 taxSubtotal,这将包括获取一个单独的product.price 的总和,其中 product.isTaxable 为真
这是包裹记录的样子:
// Package
{
_id: 1,
packTitle: "Package 1",
productCategory: {_id:90, label:"Clothing"},
products: [
{ _id:500,
"prodTitle": "Product 1",
"price": 2.99,
"isTaxable" : true
},
{ _id:501,
"prodTitle": "Product 2",
"price": 4.99,
"isTaxable" : false
},
{ _id:502,
"prodTitle": "Product 3",
"price": 6.99,
"isTaxable" : true
},
{ _id:503,
"prodTitle": "Product 4",
"price": 10.99,
"isTaxable" : false
}
]
}
我可以通过以下方式获得小计:
db.prodPacks.aggregate([
{$match: { "productCategory._id": {$in:[90]} }}
, {$unwind: '$products'}
, {$group: {
'_id': {'packId':'$_id', 'packTitle':'$packTitle'},
'packSubtotal': {$sum: '$products.price' },
'products':{'$push':'$products.title'}
}
}
])
我有 packSubtotal,我还想得到一个 taxableSubtotal(如果可能的话,在同一个聚合中,isTaxable 为 true 的 product.price 的总和。
我知道我可以使用 isTaxable 上的匹配项进行单独的聚合,然后获取小计并手动将它们相加,但我很好奇是否有一种方法可以在一次聚合中完成所有操作。
最佳答案
要获取“isTaxable”为 true
的“product.price”的总和,您需要使用 $cond
条件聚合运算符。
db.packages.aggregate([
{ "$match": { "productCategory._id": 90 } },
{ "$unwind": "$products" },
{ "$group": {
"_id": {
"packId": "$_id",
"packTitle": "$packTitle"
},
"packSubtotal": { "$sum": "$products.price" },
"products": { "$push": "$products.prodTitle" },
"taxableSubtotal": {
"$sum": {
"$cond": [ "$products.isTaxable", "$products.price", 0 ]
}
}
}}
])
关于mongodb - 在同一聚合中聚合小计和应税小计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288447/