Node.js 使用默认值计算$sum
我想计算每个特定通话的总花费 我收集具有特定callId的订单,然后从结果中求和totalPrice属性 它可以工作,除非没有顺序,否则我会得到一个空数组。我希望得到0作为TotalExpensing的默认值 这是我的疑问:Node.js 使用默认值计算$sum,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想计算每个特定通话的总花费 我收集具有特定callId的订单,然后从结果中求和totalPrice属性 它可以工作,除非没有顺序,否则我会得到一个空数组。我希望得到0作为TotalExpensing的默认值 这是我的疑问: Order.aggregate({ $match: { callId: mongoose.Types.ObjectId(callId) } }, { $group: { _id: null, totalSpending: { $sum: '$totalPri
Order.aggregate({
$match: { callId: mongoose.Types.ObjectId(callId) }
}, {
$group: { _id: null, totalSpending: { $sum: '$totalPrice' } }
})
例如,如果没有订单,我会得到一个空数组,如果至少有一个订单,我会得到
[{{u id:null,totalexpensing:50}]
。我想你需要一个$ifNull子句,如果它为null,它将返回totalprice,否则它将返回0
Order.aggregate({
$match: { callId: mongoose.Types.ObjectId(callId) }
}, {
$group: { _id: null, totalSpending: {
$sum: {
$ifNull: ['$totalSpending', 0]
}
}
})
你可以试试这样的 将
$project
与$cond
一起使用,而不是$match
。这会将不匹配的callId
文档totalPrice
覆盖为0
Order.aggregate({
$project: {
totalPrice: {
$cond: [{
$eq: ["$callId", mongoose.Types.ObjectId(callId)]
}, "$totalPrice", 0]
}
}
}, {
$group: {
_id: null,
totalSpending: {
$sum: '$totalPrice'
}
}
})
仍然得到一个空数组。问题是,如果$match未返回任何结果,则根本不会调用$group管道。您可以使用collection.count检查它是否存在,并且订单计数不是0。如果是,则可以将TotalExpensing数组返回为0。如果计数大于0,则可以进行上述聚合。是的,但这需要额外的查询。我想在1个查询中完成它。聚合管道是按顺序计算的。您只需查找空数组并返回
TotalExpensing
,因为0这在聚合中可能吗?