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

时间:2018-07-05 16:30:53

标签: mongodb count grouping aggregation

我在这个查询上苦苦挣扎。

我的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 :(得分:0)

您必须使用$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 }
    }
])