首页 > 解决方案 > Mongo Aggregation:计算具有和不具有值匹配的嵌套数组的不同帐户

问题描述

我有这样的文件:

{ account: 2, {payments: [{flag: false, amt: 100},{flag: false, amt: 100}]},
{ account: 3, {payments: [{flag: false, amt: 100},{flag: false, amt: 100}]},
{ account: 4, {payments: [{flag: true, amt: 50},{flag: false, amt: 100}]} 

我想汇总和汇总 amt 并计算至少 1 个 true 的帐户

{"true": { "count":2, "sum_amt": 150}},
{"false": { "count": 2, "sum_amt": 0}}

*注意:我正在计算至少有 1 个真实的不同帐户与所有错误的帐户。

我努力了

[
  {
    $unwind: {
      path: "$remits"
    }
  },
  {
    $project: {
      "_id": 1,
      account: true,
      remits: {
        flag: true
      }
    }
  },
  {
    $group: {
      _id: {
        flag: "$payments.flag"
      },
      uniqueCount: {
        $addToSet: "$account"
      }
    }
  },
  {
    $project: {
      "flag": 1,
      cnt: {
        $size: "$uniqueCount"
      }
    }
  },
  {}
]

但我认为我需要将一个字段投影到帐户级别,如果任何至少有 1 个 true 的帐户都有一个 true .. 我无法匹配,因为我需要计算没有 true 的那些。

标签: mongodbaggregation-framework

解决方案


如果我理解正确,那么您正在寻找具有至少一个真正标志的过滤文档并进行一些分组。

假设您有以下示例文档:

{"_id":{"$oid":"5e9d17ca9db790488c44e8f6"},"account":"2","payments":[{"flag":true,"amt":{"$numberInt":"100"}},{"flag":false,"amt":{"$numberInt":"100"}}]}
{"_id":{"$oid":"5e9d1f6a9db790488c44e8f9"},"account":"3","payments":[{"flag":false,"amt":{"$numberInt":"100"}},{"flag":false,"amt":{"$numberInt":"100"}}]}
{"_id":{"$oid":"5e9d1f769db790488c44e8fa"},"account":"4","payments":[{"flag":true,"amt":{"$numberInt":"50"}},{"flag":false,"amt":{"$numberInt":"100"}}]}

我们使用以下管道查询:

[{$match: {
  'payments.flag': true 
}}, {$unwind: {
  path: "$payments"
}}, {$group: {
  _id:{$concat: [ "Account:",'$account','-',{$toString:'$payments.flag'}]},
  count: {
   $sum: 1
  },
  amount:
  {$sum:'$payments.amt'}
}}]

输出如下:

_id:"Account:4-false"
count:1
amount:100

_id:"Account:2-false"
count:1
amount:100

推荐阅读