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
阶段应该如下:
$month
- 从 createdAt
. 中获取月份值
$eq
- 比较 (1) 中的月份和输入的月份是否相同。
{
$match: {
$expr: {
$eq: [
{
"$month": "$createdAt"
},
thisMonth.getMonth() + 1
]
}
}
}
我正在聚合以对 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
阶段应该如下:
$month
- 从createdAt
. 中获取月份值
$eq
- 比较 (1) 中的月份和输入的月份是否相同。
{
$match: {
$expr: {
$eq: [
{
"$month": "$createdAt"
},
thisMonth.getMonth() + 1
]
}
}
}