Подсчет уникальных документов в MongoDB - PullRequest
1 голос
/ 03 февраля 2020

Это мой запрос на подсчет документов в коллекции на основе полей fullDate & key:

Collection.aggregate([
  { $match: { $and: [
      { month },
      { year },
      { isBooked },
    ] }},
  { $group: { _id: "$fullDate", count: { $sum: 1 } } }
]

Допустим, это отфильтрованная коллекция (после первого этапа, т.е.; $match):

{ month: 5, year: 2012, isBooked: true, fullDate: 2020/7/5, key: 123qaz }
{ month: 5, year: 2012, isBooked: true, fullDate: 2020/7/5, key: 123qaz }
{ month: 5, year: 2012, isBooked: true, fullDate: 2020/7/5, key: 223qaz }
{ month: 5, year: 2012, isBooked: true, fullDate: 2020/7/5, key: 323qaz }

Приведенный выше запрос вернет 2020/7/5: 4. Мне нужно изменить запрос, чтобы получить 2020/7/5: 3, поскольку есть два документа с одинаковым ключом 123qaz. Я не хочу считать дубликаты по ключу.

1 Ответ

2 голосов
/ 03 февраля 2020

Попробуйте:

Collection.aggregate([{
    $match: {
        $and: [
            { month },
            { year },
            { isBooked },
        ]
    }
},
/** group by fullDate & push unique keys to an array */
{ $group: { _id: "$fullDate", uniqueKeys: { $addToSet: '$key' } } },
/** project a new field 'count' which is size of uniqueKeys, _id is projected by default,
 *  Use $addFields in place of project if multiple fields to be projected */
{ $project: { count: { $size: '$uniqueKeys' } } }])

Тест: MongoDB-Playground

...