【问题标题】:Aggregate subtotal and a taxableSubTotal in same aggregation聚合小计和同一聚合中的 taxableSubTotal
【发布时间】:2016-05-18 00:50:20
【问题描述】:

我有一个包含包的数据模型,每个包都有一个产品文档数组。 每个产品文档都有一个价格和一个 isTaxable:boolean 字段

我可以汇总获取每个包裹的小计 (product.price $sum),但我不知道如何“也”在同一聚合中获取 taxSubtotal,这包括获取单独的product.isTaxable 为 true 的 product.price 的总和

这是包裹记录的样子:

// 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 进行匹配进行单独聚合,然后获取该小计并手动将它们相加,但我很好奇是否有一种方法可以在一个聚合中完成所有操作。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    要获得“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 ] 
                } 
            } 
        }}
    ])
    

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 2015-03-10
      • 2012-03-08
      • 2014-10-26
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多