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

MongoDB聚合查询结果如何同时包含id与_id字段?

解决MongoDB聚合查询中无法返回Mongoose虚拟字段id的问题

问题场景

使用Mongoose的aggregate进行Faculty关联Programs的查询时,结果仅返回_id字段,无法获取定义的虚拟字段id;但普通查询(如find)能正常同时返回id和_id。

原因说明

Mongoose的虚拟字段(包括通过toJSON配置自动包含的虚拟字段)仅在处理Mongoose文档实例时生效。而aggregate操作直接返回MongoDB的原始文档(RawDocument),绕过了Mongoose的文档转换逻辑,因此虚拟字段id不会被自动添加到结果中。

解决方案

方法1:在聚合管道中手动添加id字段

通过$addFields阶段,将_id转换为字符串格式并赋值给id字段,直接在聚合阶段完成字段添加:

await Faculty.aggregate([
  {
    $lookup: {
      from: 'programs',
      localField: '_id',
      foreignField: 'faculty',
      as: 'programs'
    }
  },
  {
    $addFields: {
      id: { $toString: '$_id' } // 将ObjectId转为字符串作为id
    }
  }
]);

方法2:将聚合结果转为Mongoose文档

使用Mongoose的hydrate方法,把聚合返回的原始文档转为Mongoose文档实例,触发虚拟字段的getter和toJSON配置,自动添加id字段:

const aggregateResults = await Faculty.aggregate([
  {
    $lookup: {
      from: 'programs',
      localField: '_id',
      foreignField: 'faculty',
      as: 'programs'
    }
  }
]);

// 将结果转为Mongoose文档并转为JSON格式
const formattedResults = aggregateResults.map(doc => Faculty.hydrate(doc).toJSON());

两种方法均可让查询结果同时包含_id和id字段,符合预期需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:31:03