如何合计计算字段的每个枚举的总数?

Posted

技术标签:

【中文标题】如何合计计算字段的每个枚举的总数?【英文标题】:how to calculate total for each enum of a field in aggregate? 【发布时间】:2021-10-09 13:42:21 【问题描述】:

你好我有这个函数,我想计算一个数组中每个状态的订单数,代码是

    let statusEnum = ["pending", "canceled", "completed"];
  let userOrders = await Orders.aggregate([
    
      $match: 
        $or: [
           senderId: new mongoose.Types.ObjectId(req.user._id) ,
           driverId: new mongoose.Types.ObjectId(req.user._id) ,
           reciverId: new mongoose.Types.ObjectId(req.user._id) ,
        ],
      ,
    ,
    
      $group: 
        _id: null,
        totalOrders:  $sum: 1 ,
        totalPendingOrders: "??", //I want to determine this for each order status
        totalCompletedOrders: "??",
        totalCanceledOrders: "??",
      ,
    ,
  ]);

所以我可以添加一个 $match 并使用 status : "pending" 但这将只过滤待处理的订单,我还可以映射状态枚举并替换每个元素而不是上面的 "pending" 然后推送另一个数组中的每次迭代,但这看起来很混乱,有没有其他方法可以只使用一个聚合来计算每个订单状态的总数?

谢谢

【问题讨论】:

【参考方案1】:

你可以像以前一样使用组,但有条件

db.collection.aggregate([
  
    $group: 
      _id: null,
      totalPendingOrders: 
        $sum:  $cond: [  $eq: [ "$status", "pending" ] , 1, 0 ] 
        ,
      totalCompletedOrders: 
        $sum:  $cond: [  $eq: [ "$status", "completed" ] , 1, 0 ] 
        ,
      totalCanceledOrders: 
        $sum:  $cond: [  $eq: [ "$status", "canceled" ] , 1, 0 ] 
        
    
  
])

工作Mongo playground

【讨论】:

谢谢你的作品,我也发现了这个,它有点短,$group: _id: "$status", count: $sum: 1 , totalPrice: $sum: "$ price" , ,它会计算所有可用状态并且可以正常工作:)

以上是关于如何合计计算字段的每个枚举的总数?的主要内容,如果未能解决你的问题,请参考以下文章

excel问题,将两个表中的数量合计到另外一个表中,公式是怎样的??

SQL 由人员汇总到部门树递归合计总数函数

SQL 语句取合计数

在word中如何计算插入图片总数?谢谢

sql 分组 求累计值

使用FastReport设计分组汇总及合计报表(图文)