Монго: как группировать документы коллекции на основе ключа, который является свойством внутреннего документа - PullRequest
0 голосов
/ 05 марта 2019

У меня есть коллекция документов, каждый из которых представляет голос за фильм.Каждый документ содержит внутренний документ, который описывает фильм.Примерно так

{movie: {_id: '123', name: 'fargo'}, vote: 'good'},
{movie: {_id: 'abc', name: 'fargo'}, vote: 'good'},
{movie: {_id: 'abc', name: 'fargo'}, vote: 'bad'},
{movie: {_id: 'xyz', name: 'fargo'}, vote: 'good'},

По какой-то причине со временем один и тот же фильм «Фарго» был помечен разными _id, но это один и тот же фильм.Другими словами, реальный ключ для фильма - это name, а не _id, как это обычно можно представить.

Теперь я хотел бы сделать это group, с помощью агрегации конвейер, все фильмы с одинаковыми name, игнорируя тот факт, что они могут иметь разные _id s, и подсчитывать количество good и плохо голосов, которые они получили.

Итак, в случае примера я хотел бы получить в результате агрегации что-то вроде

{name: 'fargo', votes: [
  {vote: 'good', count: 3},
  {vote: 'bad', count: 1}
]}

До сих пор я пытался

{$group: {_id: {movieName: "$movie.name", vote: "$vote"}, count: {$sum: 1}, }}

но безуспешно.

Любое предложение понять, где я совершил ошибку, будет оценено.

1 Ответ

0 голосов
/ 05 марта 2019

Это то, что вы ищете:

[
    {$project: {
      _id: "$movie.name",
      "good": {$cond: {if: {$eq: ["$vote","good"]}, then: 1, else: 0}},
      "bad": {$cond: {if: {$eq: ["$vote","bad"]}, then: 1, else: 0}}
    }},
    {$group: {
      _id: "$_id",
      good: {$sum: "$good"},
      bad: {$sum: "$bad"}
    }}
]

Вывод (для ваших образцов документов):

{
  "_id" : "fargo",
  "good" : 3.0,
  "bad" : 1.0
}

Объяснение этапов конвейера:

  1. Проект: используйте название движения как _id и представляйте хорошо и плохо голосов численно
  2. Группа: подсчитывайте каждый голос отдельно для каждого фильма
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...