Mongodb groupby 字段并显示其他字段出现次数

Mongodb groupby field and show other field occurrences count

我正在为这个查询苦苦挣扎,但运气不好。

我的 mongodb

中有以下项目 collection
[
    { 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},
]

那么,我的聚合查询应该是什么样的。

您必须使用 $group twice: after first pipeline you'll count all values inside (channel, name) pair (using $sum). Then you can use $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 }
    }
])