关于mongoose返回的对象无法修改的原因以及解决方法
我们在使用 Mongoose
的时候,或许大家都会发现回调返回的
result
无法进行修改,Google
了一下,现在把方法做一个总结,方便今后搜索。
原因
实际上 mongoose
返回的数据并不是
object
,虽然通过 typeof
判断类型是
Object
,但其实 mongoose
自己封装的一个对象(Mongoose
Document),这个对象的原型里面挂载了很多方法,并且这个对象会对数据进行实时查询以保证其符合预定义的
model
,而无论添加删除model
都不会改变,所以设置无效。
聚合查询出来的结果不需要转换
解决办法
toObject()
在返回的 result 对象调用 toObject()
或
toJSON()
方法,则可以对它进行修改。
本质上使用
toObject
和toJSON
都是可以的,其实这两个方法一般来说是没区别的,而如果要讲究区别的话,那就是如果使用toJSON
的话,对生成的对象用JSON.stringify
,此时用的是这个对象本身的toJSON
方法来序列化,而不是原生对象Object
的方法。
.lean()
可以通过使用 lean
将结果转成纯 javascript 对象。
启用 lean 选项的查询返回的文档是纯 javascript 对象,而不是 Mongoose 文档。它们没有 save 方法、getter/setter、virtuals 或其他 Mongoose 特性。
1 | new Query().lean() // true |
参考
- 关于mongoose返回的数据无法修改的原因以及解决方法
- Mongoose返回数据修改中遇到的坑
- https://mongoosejs.com/docs/api/query.html#query_Query-lean