mongodb - 在同一聚合中聚合小计和应税小计

标签 mongodb mongodb-query aggregation-framework

我有一个包含包的数据模型,每个包都有一组产品文档。 每个产品文档都有一个价格和一个 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/

相关文章:

javascript - MongoDB 按 _id 的时间戳分组

javascript - 如何查找数组中不包含在 MongoDB 集合中的项目

node.js - 是否可以打包一个 'real' mongodb 库以仅在 meteor 0.6 中用于 *server* 端

node.js - 有没有办法使用聚合从 Mongoose 的 ObjectId 获取日期?

javascript - 如何求和数据库中的字段

mongodb - 如何基于唯一元素作为字段创建聚合?

c# - 使用 MongoDb 和 C# 的模式依赖类到无模式文档

mongodb - 选择一个包含元素数量有限的数组的文档

node.js - 在 Nodejs 中将值推送到 Mongodb 模型中

mongodb - 在 Mongoose 中进行条件查找