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

如何通过Mongoose获取指定batchId数组中每个ID对应的首条文档?

当然没问题!这在MongoDB里用聚合框架就能轻松实现,我给你详细讲讲怎么做:

获取每个batchId的首条文档

核心思路

我们可以通过聚合管道先按batchId对文档分组,然后在每个分组中提取第一条文档。如果需要按特定规则(比如时间顺序)来定义“首条”,还可以先对文档排序再分组。

具体实现代码

1. 基础版(按文档存储顺序取首条)

// 替换成你的集合名称
db.yourCollection.aggregate([
  {
    $group: {
      _id: "$batchId", // 按batchId分组
      firstDocument: { $first: "$$ROOT" } // $$ROOT代表当前完整文档,$first取分组内第一条
    }
  },
  {
    $replaceRoot: { newRoot: "$firstDocument" } // 把结果格式转回原文档结构
  }
])

2. 针对指定batchId数组的版本

如果你只想处理给定的[001, 002, 003]这些batchId,可以先加一个$match步骤过滤数据:

db.yourCollection.aggregate([
  // 过滤出目标batchId的文档,注意batchId如果是字符串类型要加引号
  { $match: { batchId: { $in: ["001", "002", "003"] } } },
  {
    $group: {
      _id: "$batchId",
      firstDocument: { $first: "$$ROOT" }
    }
  },
  { $replaceRoot: { newRoot: "$firstDocument" } }
])

3. 按自定义顺序取首条(比如按时间排序)

如果“首条”是指某个字段排序后的第一条(比如最早创建的文档),可以在分组前加$sort步骤:

db.yourCollection.aggregate([
  { $match: { batchId: { $in: ["001", "002", "003"] } } },
  // 按createTime升序排序,确保最早的文档在分组里排第一
  { $sort: { createTime: 1 } },
  {
    $group: {
      _id: "$batchId",
      firstDocument: { $first: "$$ROOT" }
    }
  },
  { $replaceRoot: { newRoot: "$firstDocument" } }
])

关键说明

  • $$ROOT是MongoDB的系统变量,代表当前正在处理的完整文档,用它可以保留原文档的所有字段。
  • $replaceRoot步骤是为了让最终返回的文档结构和原集合的文档结构一致,不然结果会嵌套在firstDocument字段里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:11:12