Подсчитать количество строк на основе значения элемента дочернего массива - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь подсчитать количество строк, имеющих значение элемента дочернего массива как true.

{
   _id: 1,
   name: 'test',
   items: [{'name': 'harry', valid: true}]
},
{
   _id: 2,
   name: 'walter',
   items: [{'name': 'potter', valid: false}]
},
{
   _id: 3,
   name: 'walter',
   items: [{'name': 'baby', valid: true}]
}

Мне нужно получить количество с помощью функции агрегата.В результате,

count 3, valid: 2, nonValid: 1

Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 09 марта 2019
db.collection.aggregate(
    {
    $group: {
        _id:1,
        valid:{
            $sum: {$cond: [{$eq: ['$items.valid',true]},1,0]}
        }
        ,
        nonValid:{
              $sum: {$cond: {if:{$eq: ["$items.valid",false]},then:1,else:0}}
        },
             count:{$sum: 1},
    }
},
{
    $project: {_id:0}
}
)

Вам необходимо group документ с Id как 1 и считать с условием, используя $ cond с $ sum и подавлять _id.

0 голосов
/ 09 марта 2019
db.collection.aggregate([
  { "$group": {
    "_id": null,
    "count": { "$sum": 1 },
    "valid": {
      "$sum": {
        "$size": {
          "$filter": {
            "input": "$items",
            "cond": "$$this.valid"
          }
        }
      },
    "nonValid": {
      "$sum": {
        "$size": {
          "$filter": {
            "input": "$items",
            "cond": { "$not": "$$this.valid" }
          }
        }
      }
    }
  }}
])

Вам нужен только один $group конвейер и аккумулятор $sum здесь. «Подсчет массивов» осуществляется через $size из соответствующих элементов $filter, где cond запрашивает логическое выражение.

Поскольку valid в элементах массива уже является логическим, возвращаемое значение должно быть true, чтобы быть числом valid, или $not true, чтобы быть nonValid

...