Пн go Агрегация: подсчет различных учетных записей с вложенным массивом с совпадением значений и без него - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть такой документ:

{ 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}]} 

Я хочу объединить и суммировать счет и подсчитать как минимум 1 истинный

{"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 истинным. Я не могу сопоставить, так как мне нужно сосчитать те, у которых нет истинного.

1 Ответ

0 голосов
/ 20 апреля 2020

Если я правильно понял, вы хотите отфильтровать документы по крайней мере с одним истинным флагом и сделать некоторую группу по.

Допустим, у вас есть образцы документов ниже:

{"_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
...