Mongodb сгруппировать поля и показать счетчик других полей - PullRequest
0 голосов
/ 05 июля 2018

Я бьюсь над этим запросом безуспешно.

имея следующую коллекцию предметов в моем mongodb

[
    { name: 'xxxx' , channel: 'A' },
    { name: 'yyyy' , channel: 'C' },
    { name: 'xxxx' , channel: 'C' },
    { name: 'xxxx' , channel: 'A' },
    { name: 'yyyy' , channel: 'A' },
    { name: 'yyyy' , channel: 'C' },
    { name: 'xxxx' , channel: 'A' },
    { name: 'xxxx' , channel: 'B' },
    { name: 'xxxx' , channel: 'C' },
];

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

поэтому результат агрегирования должен выглядеть следующим образом

[
    { name: 'xxxx', count: 6 , top_channel: 'A', top_channel_count: 3},
    { name: 'yyyy', count: 3 , top_channel: 'C', top_channel_count: 2},
]

Итак, как должен выглядеть мой запрос агрегации.

1 Ответ

0 голосов
/ 05 июля 2018

Вы должны использовать $ group дважды: после первого конвейера вы будете считать все значения в паре (channel, name) (используя $sum). Затем вы можете использовать $ sort для изменения порядка элементов, поэтому в следующей группе вы получите верхний канал, используя оператор $first:

db.col.aggregate([
    {
        $group: {
            _id: { name: "$name", channel: "$channel" },
            count: { $sum: 1 }
        }
    },
    {
        $sort: { count: -1 }
    },
    {
        $group: {
            _id: "$_id.name",
            count: { $sum: "$count" },
            top_channel: { $first: "$_id.channel" },
            top_channel_count: { $first: "$count" }
        }
    },
    {
        $sort: { count: -1 }
    }
])
...