MongoDB如何获取两个字段唯一组合对应的最新文档
你可以通过MongoDB的聚合管道直接在数据库层完成该过滤逻辑,具体查询语句如下:
兼容所有MongoDB版本的写法
// 请将your_collection替换为实际的集合名 db.your_collection.aggregate([ // 按创建时间倒序排列所有文档,保证每个组合的最新文档排在最前 { $sort: { created: -1 } }, // 按primaryId和secondaryIdx的组合进行分组 { $group: { _id: { primaryId: "$primaryId", secondaryIdx: "$secondaryIdx" }, // 取每组的第一个文档(即创建时间最新的完整文档) latestDoc: { $first: "$$ROOT" } } }, // 将存储的最新文档恢复为原始结构返回 { $replaceRoot: { newRoot: "$latestDoc" } }, // 可选:如果需要对最终结果排序可新增该阶段,示例为按创建时间升序排列 { $sort: { created: 1 } } ])
MongoDB 5.2及以上版本的高性能写法
如果你的MongoDB版本在5.2及以上,可以使用$top运算符省去全局排序步骤,进一步提升查询性能:
db.your_collection.aggregate([ { $group: { _id: { primaryId: "$primaryId", secondaryIdx: "$secondaryIdx" }, latestDoc: { $top: { sortBy: { created: -1 }, output: "$$ROOT" } } } }, { $replaceRoot: { newRoot: "$latestDoc" } } ])
如果需要提前过滤不需要的数据,可以在聚合的最开头添加$match阶段缩小查询范围,比如仅查询2021年之后的数据:
{ $match: { created: { $gte: ISODate("2021-01-01T00:00:00Z") } } }
内容的提问来源于stack exchange,提问作者ZsYoR
相关产品推荐
相关产品推荐

