Подсчет нескольких вхождений поля на основе отдельного поля - PullRequest
1 голос
/ 14 марта 2020

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

[{
  _id:ObjectId("abc"),
  "who":"person1",
  "action":"joined"
},{
  _id:ObjectId("def"),
  "who":"person2",
  "action":"joined"
},{
  _id:ObjectId("ghi"),
  "who":"person1",
  "action":"left"
}]

, и я хотел бы, чтобы вывод был

[{
  "who":person1",
  "total":2,
  "left":1,
  "joined":1
},{
  "who":person2",
  "total":1,
  "left":0,
  "joined":1
}]

Где total - это счетчик поля действия, а затем подсчитываются две опции для поля действия в зависимости от поля 'who'

1 Ответ

1 голос
/ 14 марта 2020

Вы можете использовать $ group вместе с $ sum и применять $ cond , чтобы определить, является ли action left или joined:

db.collection.aggregate([
    {
        $group: {
            _id: "$who",
            total: { $sum: 1 },
            left: { $sum: { $cond: [ { $eq: [ "$action", "left" ] }, 1, 0 ] } },
            joined: { $sum: { $cond: [ { $eq: [ "$action", "joined" ] }, 1, 0 ] } }
        }
    }
])

Пн go Детская площадка

...