You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:39:03