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

MongoDB查询获取最新数据:如何筛选符合条件的最新记录?

解决方案

你的核心需求是获取符合查询条件的每个唯一实体(比如按name区分)的最新一条记录,而不是返回所有历史记录或仅单条记录。可以通过MongoDB的聚合管道实现这个需求,具体方案如下:

基础实现(按name分组取最新记录)

假设你需要查询region: "asia"下,每个name对应的最新历史记录,使用以下聚合查询:

db.collection.aggregate([
  // 1. 先筛选出符合条件的文档
  { $match: { "region": "asia" } },
  // 2. 按创建时间降序排序,确保最新的记录排在每组最前面
  { $sort: { "created_at": -1 } },
  // 3. 按`name`分组,保留每组的第一条记录(也就是最新的那条)
  { $group: {
      _id: "$name",
      latestRecord: { $first: "$$ROOT" }
    }
  },
  // 4. 将分组后的最新记录恢复为原始文档结构
  { $replaceRoot: { newRoot: "$latestRecord" } }
])

进阶调整

  • 如果你的唯一实体需要按name+region组合区分(比如不同区域可能有同名的记录),只需修改$group的_id字段:
    { $group: {
        _id: { name: "$name", region: "$region" },
        latestRecord: { $first: "$$ROOT" }
      }
    }
    
  • 如果要同时指定name条件(比如name: "ramu"),直接在$match里追加条件即可:
    { $match: { "region": "asia", "name": "ramu" } }
    

性能优化

由于你的集合会每日新增数据,为了提升查询速度,建议创建复合索引:

db.collection.createIndex({ "region": 1, "name": 1, "created_at": -1 })

这个索引可以让$match和$sort阶段直接利用索引过滤排序,避免全表扫描。

为什么之前的查询不满足需求

  • 第一个查询仅做了排序但未过滤分组,所以返回所有符合条件的历史记录;
  • 第二个查询用limit(1)只返回了排序后的第一条记录,无法覆盖所有符合条件的实体分组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:17:15