MongoDB聚合:按年份与流派去重统计不同title数量
解决MongoDB按年份、流派分组统计去重影片标题数量的问题
问题分析
你当前的聚合代码用$sum:1统计的是分组内的总文档数,但同一个影片标题对应多个演员文档,所以需要先对标题去重,再统计数量。
正确的聚合实现
方式一:两次分组去重统计
需要分两个阶段完成:
- 第一阶段:按
year、genres和title分组,实现标题去重,每个唯一标题在对应年份和流派下只保留一条记录。 - 第二阶段:按
year和genres分组,统计去重后的标题数量。
完整代码如下:
var stages = [ // 第一步:按年份、流派、标题分组,完成标题去重 { $group: { "_id": { "year": "$year", "genre": "$genres", "title": "$title" } } }, // 第二步:按年份、流派分组,统计去重后的标题数量 { $group: { "_id": { "year": "$_id.year", "genre": "$_id.genre" }, "count": { $sum: 1 } } } ]; db.genres.aggregate(stages);
方式二:用$addToSet+$size简化实现
也可以用$addToSet将分组内的所有唯一标题存入数组,再用$size获取数组长度,一步完成统计:
var stages = [ { $group: { "_id": { "year": "$year", "genre": "$genres" }, "uniqueTitles": { $addToSet: "$title" } } }, { $project: { "_id": 1, "count": { $size: "$uniqueTitles" } } } ]; db.genres.aggregate(stages);
结果说明
执行任意一种方式的代码后,都会得到你期望的输出:
{ "_id": { "year": 2008, "genre": "Sports" }, "count": 2 }
内容的提问来源于stack exchange,提问作者DatBigD
相关产品推荐
相关产品推荐

