如何在MongoDB聚合中$ match然后在$ group阶段累积

时间:2018-07-11 15:06:04

标签: javascript mongodb aggregation-framework

在MongoDB视图管道中的一个聚合阶段,我正在使用$group。在该$group阶段中,我正在做的一件事是总结一个openBalance,如下所示:

  "openBalance": {
    "$sum": "$openBalance"
  },

这有效。

但是,我还需要获取另一个值,该值首先与条件匹配,然后然后对数据求和。换句话说,是这样的:

  "customerResponsibleOpenBalance": {
    "$match": {
      "customerResponsible": true
    },
    "$sum": "$openBalance"
  },

但是,我不能在$group阶段这样做,因为它会导致此错误:

  

customerResponsibleOpenBalance必须指定一个累加器。

那么我将如何以不同的方式去做呢? $facets是我唯一的选择吗?

1 个答案:

答案 0 :(得分:1)

$group处理一组文档,因此您只能使用累加器来获取结果。要有条件获得$sum,可以在其中使用$cond运算符,如果不匹配,则添加0

{
    $group: {
        _id: null,
        balanceForTrue: { $sum: { $cond: { if: { $eq: [ "$customerResponsible", true ] }, then: "$balance", else: 0  } } },
        balanceForFalse: { $sum: { $cond: { if: { $eq: [ "$customerResponsible", false ] }, then: "$balance", else: 0  } } }
    }
}