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

如何从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
    }
  }
])

方案说明

  1. $match阶段:和你原来的find条件一致,先过滤出目标日期范围内的所有交易记录,减少后续处理的数据量。
  2. $sort阶段:先按agentId分组排序,再按createdAt降序排列,这样同一个agentId的记录中,最新的交易一定会排在该组的最前面。
  3. $group阶段:以agentId为分组依据,用$first操作符提取每组的第一条记录(也就是最新的交易)的各个字段,实现每个agent只保留一条最新记录的需求。
  4. $project阶段:可选步骤,主要是调整输出字段的名称和显示,让结果更符合你的预期(比如把分组用的_id改回agentId,隐藏不需要的字段)。

为什么原来的方法行不通?

  • 单纯的find查询只能返回所有符合条件的文档,无法自动按agentId去重并筛选最新记录。
  • 你尝试的$last、$natural需要结合聚合管道使用,$natural是基于文档的存储顺序,并非时间顺序,所以无法准确获取最新的交易记录。

在Mongo Compass中,你可以直接切换到「聚合」标签页,将上述代码粘贴进去运行即可得到结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:40:34