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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:55:23