如何合计计算字段的每个枚举的总数?
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" , ,它会计算所有可用状态并且可以正常工作:)以上是关于如何合计计算字段的每个枚举的总数?的主要内容,如果未能解决你的问题,请参考以下文章