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
相关产品推荐
相关产品推荐

