MongoDB подсчитывает поля объекта на основе условия - PullRequest
1 голос
/ 15 апреля 2020

Предположим, у меня есть документы:

{
  "X": {
    "Y": {
      "a": true,
      "b": false,
      "c": true
    }
  }
}

{
  "X": {
    "Y": {
      "a": true,
      "b": false,
    }
  }
}

Я хочу вернуть количество true полей в Y примерно так:

{
  "X": {
    "Y": 2
  }
}

{
  "X": {
    "Y": 1
  }
}

Количество Y поля не обязательно одинаковы в каждом документе, а некоторые документы вообще не содержат Y. Как я могу добиться этого с помощью структуры агрегации?

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$project": {
    "X.Y": {
      "$size": {
        "$filter": {
          "input": {
            "$objectToArray": { "$ifNull": ["$X.Y", { "Y": {} }] }
          },
          "as": "d",
          "cond": { "$eq": ["$$d.v", true] }
        }
      }
    }
  }}
])

MongoPlayground

...