同一聚合中的聚合小计和taxableSubTotal

时间:2016-05-18 00:50:21

标签: mongodb mongodb-query aggregation-framework

我有一个带有Packages的数据模型,每个Package都有一个Product文档数组。 每个产品文档都有一个价格和一个isTaxable:boolean field

我可以在获取每个包的小计(product.price $ sum)时进行汇总,但我无法弄清楚如何"还有"在相同的聚合中获取taxSubtotal,其中包括获取product.price,其中product.isTaxable为true的单独的总和

这是包记录的样子:

// 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
          }
    ]
}

我可以通过以下方式获取subTotal:

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(product.price的总和,其中isTaxable是真的,如果可能的话,在同一个聚合中。

我知道我可以使用isTaxable上的匹配进行单独聚合,然后获取该小计并手动将它们添加到一起,但我很好奇是否有办法在一个聚合中完成所有操作。

1 个答案:

答案 0 :(得分:2)

获得" product.price"的总和其中" isTaxable"是true您需要使用$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 ] 
            } 
        } 
    }}
])