使用Object.assign()处理Mongoose查询返回文档的多余数据问题
解决Mongoose文档用Object.assign()出现多余数据的问题
这个坑我之前踩过好几次!核心原因是:Mongoose查询返回的doc不是原生JavaScript对象,而是Mongoose封装的Document实例,它自带了一堆框架内部的方法和属性,这就是你看到的“多余数据”。
为什么直接访问没问题,但Object.assign()就不行?
- 直接访问
doc.xxx时,Mongoose通过自定义的getter做了拦截,会自动从实例内部的_doc属性里取出真实的文档数据,所以你感觉和用普通对象一样顺畅。 - 但
Object.assign()会遍历对象的所有可枚举属性,包括Mongoose给Document实例添加的那些额外方法和内部属性,自然就把多余的内容也拷贝进去了。
几种实用的解决方案
根据你的使用场景选就行:
1. 用toObject()转成纯净JS对象(官方推荐)
把Document实例转成普通对象后,再用Object.assign()就不会带多余数据了:
UserModel.findOne(query, function(err, doc){ if (err) { /* 别忘了错误处理 */ } const plainDocument = doc.toObject(); const updatedDoc = Object.assign(plainDocument, { someProp: '你要加的属性' }); console.log(updatedDoc); // 现在只有文档本身的数据和你新增的属性啦 });
2. 解构_doc属性快速合并
如果只是要合并少量属性,解构赋值更简洁:
UserModel.findOne(query, function(err, doc){ if (err) { /* 错误处理 */ } const updatedDoc = { ...doc._doc, someProp: '你要加的属性' }; console.log(updatedDoc); });
3. 查询时直接返回普通对象(lean: true)
如果你的场景只需要读取数据,不需要Mongoose Document的方法(比如save()、remove()),可以在查询时加lean: true选项,直接拿到原生JS对象:
UserModel.findOne(query, null, { lean: true }, function(err, doc){ if (err) { /* 错误处理 */ } const updatedDoc = Object.assign(doc, { someProp: '你要加的属性' }); console.log(updatedDoc); // 直接用,完全没有多余数据 });
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

