首页 > 解决方案 > 如何合计计算字段的每个枚举的总数?

问题描述

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

    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"} 但这将只过滤待处理的订单,我还可以映射状态枚举并替换每个元素而不是上面的“待处理”,然后将每个迭代推入另一个数组,但这看起来很乱,有没有其他方法可以只使用一个聚合来计算每个订单状态的总计?

谢谢

标签: node.jsmongodbexpressmongooseaggregate

解决方案


您可以按使用方式使用组,但有条件

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

工作蒙戈游乐场


推荐阅读