如何从MongoDB集合获取符合日期过滤的Agent最新唯一交易记录
MongoDB聚合查询优化方案:获取每个Agent的最新唯一交易记录
你的问题核心是要在指定日期范围内,对每个agentId去重并获取其最新交易记录,单纯的find查询无法实现这个需求,需要用聚合管道来完成,以下是具体方案:
优化后的聚合查询代码
db.transaction.aggregate([ // 1. 过滤指定日期范围的交易记录 { $match: { "createdAt": { "$gte": ISODate("2022-09-01T00:00:00Z"), "$lt": ISODate("2022-09-02T00:00:00Z") } } }, // 2. 按agentId分组排序,确保每个agent的最新记录排在组内最前面 { $sort: { "agentId": 1, "createdAt": -1 // 降序排列,最新的记录在前 } }, // 3. 按agentId分组,提取每组的第一条(最新)记录的指定字段 { $group: { "_id": "$agentId", "latestCreatedAt": { $first: "$createdAt" }, "postBalance": { $first: "$postBalance" }, "preBalance": { $first: "$preBalance" }, "walletBalance": { $first: "$walletBalance" } } }, // 4. 调整输出字段格式(可选,让结果更直观) { $project: { "_id": 0, // 隐藏默认的_id字段 "agentId": "$_id", // 将分组用的_id改回agentId "latestCreatedAt": 1, "postBalance": 1, "preBalance": 1, "walletBalance": 1 } } ])
方案说明
- $match阶段:和你原来的
find条件一致,先过滤出目标日期范围内的所有交易记录,减少后续处理的数据量。 - $sort阶段:先按
agentId分组排序,再按createdAt降序排列,这样同一个agentId的记录中,最新的交易一定会排在该组的最前面。 - $group阶段:以
agentId为分组依据,用$first操作符提取每组的第一条记录(也就是最新的交易)的各个字段,实现每个agent只保留一条最新记录的需求。 - $project阶段:可选步骤,主要是调整输出字段的名称和显示,让结果更符合你的预期(比如把分组用的
_id改回agentId,隐藏不需要的字段)。
为什么原来的方法行不通?
- 单纯的
find查询只能返回所有符合条件的文档,无法自动按agentId去重并筛选最新记录。 - 你尝试的
$last、$natural需要结合聚合管道使用,$natural是基于文档的存储顺序,并非时间顺序,所以无法准确获取最新的交易记录。
在Mongo Compass中,你可以直接切换到「聚合」标签页,将上述代码粘贴进去运行即可得到结果。
内容的提问来源于stack exchange,提问作者CuriousCat
相关产品推荐
相关产品推荐

