Агрегация MongoDB - различное количество в подмассиве - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь посчитать разные значения в подмассиве для каждого документа. Пока я получаю итоги. Моя коллекция:

[
  {
    "_id": "5e013ca474082f6852",
    "name": [
      {
        "value": "Oak",
        "date": "2020-01-01 00:10:57"
      }
    ],
    "colors": [
      {
        "nice": "bla bala",
        "color": "Blue"
      },
      {
        "nice": "bla bala",
        "color": "Red"
      },
      {
        "nice": "bla bala",
        "color": "Blue"
      },
      {
        "nice": "bla bala",
        "color": "Green"
      },
      {
        "nice": "bla bala",
        "color": "Green"
      }
    ]
  },
  {
    "_id": "57689a4740857bb2",
    "name": [
      {
        "value": "Cloud",
        "date": "2020-01-01 00:10:57"
      }
    ],
    "colors": [
      {
        "nice": "bla bala",
        "color": "Blue"
      },
      {
        "nice": "bla bala",
        "color": "Blue"
      },
      {
        "nice": "bla bala",
        "color": "Blue"
      },
      {
        "nice": "bla bala",
        "color": "Green"
      },
      {
        "nice": "bla bala",
        "color": "Green"
      }
    ]
  }
]

Результат, который я ищу:

[
  {
    "_id": "5e013ca474082f6852",
    "name": [
      {
        "value": "Oak",
        "date": "2020-01-01 00:10:57"
      }
    ],
    "colors": {
      "Blue": 2,
      "Red": 1,
      "Green": 2
    }
  },
  {
    "_id": "57689a4740857bb2",
    "name": [
      {
        "value": "Cloud",
        "date": "2020-01-01 00:10:57"
      }
    ],
    "colors": {
      "Blue": 3,
      "Green": 2
    }
  }
]

Спасибо PS Я не ставил ни одной из своих попыток агрегирования с использованием $ group, потому что до сих пор что Я получил это бесполезно :) PPS Я не знаю, что еще сказать о моей проблеме, SO говорит, что это слишком много кода, недостаточно текста.

1 Ответ

1 голос
/ 09 января 2020

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

db.collection.aggregate([
  { "$addFields": {
    "colors": {
      "$arrayToObject": {
        "$map": {
          "input": { "$setUnion": ["$colors.color"] },
          "as": "m",
          "in": {
            "k": "$$m",
            "v": {
              "$size": {
                "$filter": {
                  "input": "$colors",
                  "as": "d",
                  "cond": { "$eq": ["$$d.color", "$$m"] }
                }
              }
            }
          }
        }
      }
    }
  }}
])

MongoPlayground

...