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



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

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"然后将每个迭代推入另一个数组中,但这看起来太混乱了,是否有其他方法可以仅使用一个聚合来计算每个订单状态的总数?

感谢

您可以使用group,但是要使用condition

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

Working Mongo playground

最新更新