Node.js 使用默认值计算$sum

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

我想计算每个特定通话的总花费

我收集具有特定callId的订单,然后从结果中求和totalPrice属性

它可以工作,除非没有顺序,否则我会得到一个空数组。我希望得到0作为TotalExpensing的默认值

这是我的疑问:

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这在聚合中可能吗?