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

如何在Express中返回不含_id的MongoDB查询结果?

如何在Express + Mongoose中去除返回结果的_id字段?

问题场景

你的Express路由通过Category.find()查询分类数据时,返回结果默认包含MongoDB自动生成的_id字段,但你希望去掉这个字段,只保留分类的具体数据。


解决方案1:数据库查询时直接排除_id(推荐)

这是最优方案,因为它在数据库层面就过滤掉不需要的字段,减少数据传输量和后续处理成本。只需要在find()的第二个参数中指定_id: 0即可:

router.get('/', async function (req, res, next) { 
  // 获取分类数据,明确排除_id字段
  const categories = await Category.find({}, { _id: 0 }); 
  // 用res.json()替代JSON.stringify + res.send,Express会自动处理格式和响应头
  res.json(categories); 
});

解决方案2:在JavaScript层面过滤(适合已获取数据的场景)

如果因为某些原因你已经拿到了包含_id的查询结果,可以在代码中手动去除这个字段。注意如果是Mongoose的文档对象,需要先转成普通JavaScript对象(用toObject()或lean()):

方式A:配合lean()获取普通对象后解构过滤

router.get('/', async function (req, res, next) { 
  // 使用lean()直接获取普通JS对象(而非Mongoose文档)
  const categories = await Category.find().lean(); 
  // 用对象解构去掉_id,保留其他属性
  const filteredCategories = categories.map(({ _id, ...rest }) => rest);
  res.json(filteredCategories);
});

方式B:对Mongoose文档先转对象再处理

router.get('/', async function (req, res, next) { 
  const categoryDocs = await Category.find(); 
  // 将每个Mongoose文档转成普通对象,再删除_id
  const filteredCategories = categoryDocs.map(doc => {
    const categoryObj = doc.toObject();
    delete categoryObj._id;
    return categoryObj;
  });
  res.json(filteredCategories);
});

小提示

尽量使用res.json()代替res.send(JSON.stringify(data)),因为Express会自动帮你设置正确的Content-Type: application/json响应头,并且处理序列化细节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:00