【问题标题】:How to $match and then accumulate within $group stage in MongoDB aggregation [duplicate]如何在 MongoDB 聚合中 $match 然后在 $group 阶段内累积 [重复]
【发布时间】:2018-12-19 16:37:51
【问题描述】:

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

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

这行得通。

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

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

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

customerResponsibleOpenBalance 必须指定一个累加器。

那么我将如何以不同的方式进行此操作? $facets 是我唯一的选择吗?

【问题讨论】:

  • $group 处理一组文档。为什么要使用 $match ?这是否意味着“任何customerResponsible 字段设置为true”?
  • 是的。那是正确的。这意味着,查看文档,如果字段customerResponsible 的值设置为 true,请将其包含在此处的$sum 中。
  • 您可以将 $sum 与 $cond 表达式一起使用。类似{"$sum":{"$cond":["$customerResponsible","$openBalance",0]}}{"$sum":{"$cond":["$customerResponsible",0, "$openBalance"]}}
  • 啊,好吧,这看起来是我想要完成的正确方法。
  • "customerResponsibleOpenBalance": { "$sum": {"$cond":["$customerResponsible","$openBalance", 0] } },

标签: javascript mongodb aggregation-framework


【解决方案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  } } }
    }
} 

【讨论】:

  • 所以,澄清一下,我已经有了“openBalance”。那行得通。我还想要动态地为一个新字段生成一个值,该值总结了 openBalance,就像第一个一样,但只对那些“customerResponsible”设置为 true 的文档这样做。我还想要第三个值,在“customerResponsible”设置为 false 的情况下,给我“openBalance”的 $sum。所以,我有openBalance。那行得通。有没有办法,在这个 $group 阶段,我也可以生成我需要的其他两个值?
  • 嗨,mickl,你能告诉我为什么这不起作用...我正在将$filter 做为 3 个嵌套级别...mongoplayground.net/p/U_ohSoTZ6Rg...我只想要nokia第三个数组中的元素和第二个数组中的6666...如果您愿意,我也可以问一个问题...但是请先帮助解决这个问题
  • @AnthonyWinzlet 我想你应该因为它与这个问题无关,我会尝试看看
  • 是的,它与这个问题没有任何关系,但大多数时候我看到你在堆栈上的聚合做了惊人的事情......所以为了通知你我在这里评论......谢谢你的帮助
  • @AnthonyWinzlet 很酷,谢谢,请打开新问题,我会尝试解决这个问题,在 cmets 中很难解释
猜你喜欢
  • 2019-03-25
  • 2019-03-27
  • 2019-05-25
  • 1970-01-01
  • 2020-09-22
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多