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

Node.js中使用Mongoose保存MongoDB文档时如何排除指定字段

嗨,我来帮你搞定这个问题!不用额外装underscore也能轻松排除_id字段,这里有几种实用的方法:

方法1:保存后转换为普通对象再处理

Mongoose的save()返回的是Mongoose文档对象,不是普通JS对象,所以我们可以用toObject()把它转成普通对象,然后通过删除或者解构的方式去掉_id:

router.post('/', async (req, res) => {
  try {
    const category = new Category({
      name: req.body.name,
      icon_url: req.body.icon_url,
      items_quantity: req.body.items.length
    });
    const data = await category.save();
    
    // 方式A:转成普通对象后删除_id
    const responseData = data.toObject();
    delete responseData._id;
    res.send(responseData);

    // 方式B:用解构赋值直接排除_id(更简洁)
    // const { _id, ...responseData } = data.toObject();
    // res.send(responseData);
  } catch (err) {
    debug(err.message);
  }
});

方法2:在Schema里全局配置,一劳永逸

如果你的Category模型所有返回结果都需要排除_id,可以在定义Schema的时候设置toJSON和toObject的转换规则,这样每次返回数据时会自动去掉_id,不用每次手动处理:

// 定义Category Schema的时候加上配置
const categorySchema = new mongoose.Schema({
  name: String,
  icon_url: String,
  items_quantity: Number
}, {
  toJSON: {
    transform: function(doc, ret) {
      // 删除不需要的字段
      delete ret._id;
      return ret;
    }
  },
  toObject: {
    transform: function(doc, ret) {
      delete ret._id;
      return ret;
    }
  }
});

const Category = mongoose.model('Category', categorySchema);

之后你直接res.send(data)就可以了,因为res.send会自动把文档转成JSON,触发我们设置的transform规则,自动去掉_id。

关于lean()的用法补充

你提到的lean()主要是用于查询操作(比如find、findOne),它让Mongoose直接返回普通JS对象而不是Mongoose文档,这样性能更高。比如查询时可以这么用:

// 查询示例,不是你的save场景,但可以参考lean的用法
const category = await Category.findOne({ name: req.body.name }).lean();
const { _id, ...responseData } = category;
res.send(responseData);

但你的场景是save()之后返回数据,所以用前面两种方法更直接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:57:41