MongoDB双集合分组查询:查找编辑推荐数=1最多的平台
解决MongoDB聚合查询:找出拥有最多count_editor_choice=1记录的平台
没问题,我来帮你搞定这个查询!咱们的核心需求是从fact集合里筛选出count_editor_choice=1的记录,关联game_dimension拿到对应的平台信息,最后统计哪个平台的这类记录最多。
完整聚合查询代码
db.fact.aggregate([ // 第一步:筛选出符合条件的fact记录 { $match: { count_editor_choice: 1 } }, // 第二步:关联game_dimension集合,获取平台信息 { $lookup: { from: "game_dimension", localField: "game_id", foreignField: "game_id", as: "game_info" } }, // 第三步:展开关联得到的数组(因为lookup返回的是数组类型) { $unwind: "$game_info" }, // 第四步:按平台分组,统计每组的记录数 { $group: { _id: "$game_info.platform", editor_choice_count: { $sum: 1 } } }, // 第五步:按统计数量降序排序,最多的排在最前面 { $sort: { editor_choice_count: -1 } }, // 第六步:只取排名第一的结果 { $limit: 1 } ])
每个管道阶段的作用解释
- $match:先过滤掉
count_editor_choice不等于1的记录,减少后续聚合处理的数据量,提升查询效率。 - $lookup:相当于SQL里的左连接,通过
game_id字段把fact和game_dimension关联起来,把匹配到的游戏信息放到game_info数组里。 - $unwind:因为
$lookup返回的是数组,哪怕只有一条匹配数据也是数组形式,所以用这个操作把数组展开成单个文档,方便后续按平台分组。 - $group:以平台名称为分组键,用
$sum:1统计每个平台下符合条件的记录总数。 - $sort:按统计出来的数量从大到小排序,这样数量最多的平台会排在结果集的第一位。
- $limit:只保留排序后的第一条数据,也就是我们要找的拥有最多
count_editor_choice=1记录的平台。
补充说明
如果存在多个平台的统计数量相同且都是最大值的情况,上面的$limit只会返回其中一个。如果需要把所有并列第一的平台都返回,可以把$limit替换成以下两个阶段:
{ $group: { _id: "$editor_choice_count", platforms: { $push: "$_id" } } }, { $sort: { _id: -1 } }, { $limit: 1 }
这样会返回所有拥有最高记录数的平台列表。
内容的提问来源于stack exchange,提问作者Nidhi Agarwal
相关产品推荐
相关产品推荐

