如何编写MongoDB聚合查询获取每用户对应每视频的最长观看时长
MongoDB按用户+视频分组取最长观看时长实现方案
前置性能优化
- 首先给对应集合创建复合索引,这是数万条数据场景下秒出结果的核心:
db.你的集合名.createIndex({ userId: 1, shareId: 1, value: -1 })
该索引完全匹配分组和排序逻辑,可实现索引覆盖查询,无需加载全表数据
聚合查询语句
仅需返回用户ID、视频ID、最长时长三个字段(性能最优)
db.你的集合名.aggregate([ { $group: { _id: { userId: "$userId", shareId: "$shareId" }, maxWatchDuration: { $max: "$value" } } }, // 可选:将_id内的字段提取到结果顶层 { $project: { _id: 0, userId: "$_id.userId", shareId: "$_id.shareId", maxWatchDuration: 1 } } ])
需要返回最长时长对应的完整原始记录
db.你的集合名.aggregate([ // 配合索引直接排序,无额外计算开销 { $sort: { userId: 1, shareId: 1, value: -1 } }, { $group: { _id: { userId: "$userId", shareId: "$shareId" }, // 取分组排序后的第一条,就是最长时长的完整记录 maxRecord: { $first: "$$ROOT" } } }, // 可选:将完整记录直接作为结果返回,去掉外层嵌套 { $replaceRoot: { newRoot: "$maxRecord" } } ])
内容的提问来源于stack exchange,提问作者Daniel Shen
相关产品推荐
相关产品推荐

