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

