【问题标题】:Mongodb groupby field and show other field occurrences countMongodb 按字段分组并显示其他字段出现次数
【发布时间】:2018-07-06 04:11:20
【问题描述】:

我在这个查询中苦苦挣扎,没有运气。

在我的 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},
]

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

【问题讨论】:

    标签: mongodb count grouping aggregation


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2020-12-14
      • 1970-01-01
      相关资源
      最近更新 更多