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

