MongoDB - 带条件的总和聚合

MongoDB - Sum aggregation with conditionals

我正在聚合以对 Orders 对象执行一些分析,我想获取上个月每个订单的总价以及本月的总价,我尝试传入$match 参数,具有适当的时间条件,但它不聚合任何数据。即使我使用相同的时间条件执行 countDocuments 查询,我也会返回许多文档。

const totalThis = await Order.aggregate([
  {
    $match: {
      // should cut the amount of orders off at the beginning of the current month
      createdAt: { $gte: thisMonth.getMonth() + 1 },
    },
  },
  {
    $group: {
      // using $group, _id has to be there or it doesnt
      // return anything, though we dont need an _id
      _id: null,
      total: {
        $sum: "$totalPrice",
      },
    },
  },
]);
res.status(200).json({
  lastMonth: lastMonthSales,
  thisMonth: thisMonthSales,
  totalSalesLast: totalLast,
  totalSalesThis: totalThis,
});

在我的 Postman 请求中,lastMonth returns 0,因此返回到 totalSalesLast 的数组为空是有道理的,但是 thisMonth returns 5 个文件,所以应该可以。显然,如果我删除 $match 条件,它将聚合所有文档,但那是因为它正在处理所有文档而不是实际过滤。

要查询特定月份createdAt的文档,您的$match阶段应该如下:

  1. $month - 从 createdAt.
  2. 中获取月份值
  3. $eq - 比较 (1) 中的月份和输入的月份是否相同。
{
  $match: {
    $expr: {
      $eq: [
        {
          "$month": "$createdAt"
        },
        thisMonth.getMonth() + 1
      ]
    }
  }
}

Sample Mongo Playground