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

如何在MongoDB中高效获取每个用户的最新数据?

在MongoDB中按用户维度获取最新数据的最优实现方法

需求说明

需要从集合中按user_id分组,提取每个用户对应date字段最新的完整数据。

原始数据示例

[
  {
    _id: "1",
    user_id: "userA",
    date: "2022-10-20 11:00:00.000000000"
  },
  {
    _id: "2",
    user_id: "userA",
    date: "2022-10-25 18:00:00.000000000"
  },
  {
    _id: "3",
    user_id: "userB",
    date: "2022-10-25 18:00:00.000000000"
  },
  {
    _id: "4",
    user_id: "userC",
    date: "2022-10-25 18:00:00.000000000"
  }
]

最优实现方案:聚合管道

MongoDB的聚合管道是处理这类分组取极值需求的最优方案,核心逻辑是先排序再分组取第一条数据,具体代码如下:

db.collection.aggregate([
  // 按日期降序排序,确保每个用户的最新数据排在组内首位
  { $sort: { date: -1 } },
  // 按user_id分组,保留每组的第一个文档(即最新数据)
  {
    $group: {
      _id: "$user_id",
      latestDoc: { $first: "$$ROOT" }
    }
  },
  // 将分组中保存的最新文档还原为根文档结构
  { $replaceRoot: { newRoot: "$latestDoc" } }
])

性能优化建议

为了大幅提升大数据量下的查询效率,建议创建复合索引:

db.collection.createIndex({ user_id: 1, date: -1 })

该索引可直接被$sort和$group阶段复用,避免全表扫描。

不推荐方案对比

如果通过distinct获取所有用户ID,再循环调用find查询每个用户的最新数据,这种方式需要多次发起数据库请求,数据量越大性能越差,远不如聚合管道高效。

内容的提问来源于stack exchange,提问作者BJKang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:10:31