如何在Mongoose中投影时将_id重命名为id并隐藏原_id字段?
解决Mongoose查询时投影
_id为id且去除原_id的问题 问题根源是Mongoose默认会自动返回_id字段,哪怕你已经投影生成了id,也需要显式排除原_id。下面是几种可行的解决办法:
方法一:在投影参数中直接排除
_id
在投影对象里添加'_id': 0,就能去掉原_id字段,只保留你需要的id、name和description:const group = await Groups.findOne( { 'orgId': Number(orgId), '_id': mongoose.Types.ObjectId(id) }, {'_id': 0, 'id': '$_id', 'name': 1, 'description': 1} );方法二:使用聚合管道处理字段
用聚合的$match匹配目标文档,再通过$project精准控制返回字段,这种方式适合更复杂的字段转换场景:const groupList = await Groups.aggregate([ { $match: { 'orgId': Number(orgId), '_id': mongoose.Types.ObjectId(id) } }, { $project: { _id: 0, id: '$_id', name: 1, description: 1 } } ]); // 聚合返回数组,取第一个结果 const group = groupList[0] || null;方法三:在Schema中全局配置转换规则
如果服务中频繁需要将_id转为id,可以在Schema的toJSON选项里配置全局转换逻辑,后续所有查询返回的JSON数据都会自动处理:const groupSchema = new mongoose.Schema({ orgId: Number, name: String, description: String // 其他字段定义 }, { toJSON: { transform(doc, ret) { ret.id = ret._id; delete ret._id; // 有其他不需要的字段,也可在此删除 } } }); const Groups = mongoose.model('Groups', groupSchema);之后直接查询并返回JSON时(比如
res.json(group)),就能自动替换_id为id,得到符合要求的结构。
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

