2016-05-18 118 views
3

我有一個數據模型,其中每個數據模型都有一個產品文檔數組。 每個產品文檔有一個價格和一個isTaxable:布爾字段彙總小計和一個TaxableSubTotal在同一個彙總中

我可以做的每個包(product.price $ sum)的小計的聚合,但我不知道如何「也」得到在taxSubtotal在同一aggreation,這將包括獲取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 
      } 
    ] 
} 

我能得到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(其中isTaxable爲true的product.price的總和,如果可能的話在同一個聚合中。

我知道我可以用isTaxable上的匹配做一個單獨的聚合,然後獲得小計並手動將它們加在一起,但我很好奇是否有辦法在一個聚合中完成所有操作。

回答

2

要獲得「產品價格」的總和,其中「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 ] 
      } 
     } 
    }} 
]) 
+0

非常感謝! – Shar