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
相关产品推荐
相关产品推荐

