MongoDB如何统计用户movies_watched数组内各movie_genres元素的出现次数
MongoDB 流派统计实现方案
直接使用MongoDB聚合框架即可完成实时统计,天然适配movies_watched数组动态新增数据的场景,每次查询都会基于最新的观影记录计算,无需额外维护冗余统计字段。
具体聚合查询语句
// 替换为你要查询的用户筛选条件,这里以邮箱为例 db.users.aggregate([ // 第一步:匹配目标用户文档 { $match: { email: "rambo@hotmail.com" } }, // 第二步:展开movies_watched数组,拆分出每一条观影记录 { $unwind: "$movies_watched" }, // 第三步:展开单条观影记录的流派数组,拆分出每个单独的流派ID { $unwind: "$movies_watched.movie_genres" }, // 第四步:按流派ID分组,统计每个ID的出现次数 { $group: { _id: "$movies_watched.movie_genres", count: { $sum: 1 } } }, // 可选:调整输出字段名,更符合阅读习惯 { $project: { genre_id: "$_id", count: 1, _id: 0 } } ])
输出结果说明
针对你提供的示例数据,执行上述查询后得到的结果如下:
[ { "genre_id": 28, "count": 2 }, { "genre_id": 53, "count": 2 }, { "genre_id": 18, "count": 1 } ]
完全符合你预期的统计结果。
性能优化建议
如果用户的观影记录量级非常大,聚合查询性能不足的话,可以选择在新增观影记录时同步更新统计字段:每次插入新的观影记录时,遍历对应movie_genres数组,用$inc原子操作给对应流派的计数加1,后续直接读取统计字段即可,性能会比实时聚合更高,但需要保证写入逻辑的一致性。
内容的提问来源于stack exchange,提问作者Tianwes
相关产品推荐
相关产品推荐

