关于mongoose返回的对象无法修改的原因以及解决方法

我们在使用 Mongoose的时候,或许大家都会发现回调返回的 result 无法进行修改,Google 了一下,现在把方法做一个总结,方便今后搜索。

原因

实际上 mongoose 返回的数据并不是 object,虽然通过 typeof 判断类型是 Object,但其实 mongoose 自己封装的一个对象(Mongoose Document),这个对象的原型里面挂载了很多方法,并且这个对象会对数据进行实时查询以保证其符合预定义的 model,而无论添加删除model都不会改变,所以设置无效。

聚合查询出来的结果不需要转换

解决办法

toObject()

在返回的 result 对象调用 toObject()toJSON() 方法,则可以对它进行修改。

本质上使用toObjecttoJSON都是可以的,其实这两个方法一般来说是没区别的,而如果要讲究区别的话,那就是如果使用toJSON的话,对生成的对象用JSON.stringify,此时用的是这个对象本身的toJSON方法来序列化,而不是原生对象Object的方法。

.lean()

可以通过使用 lean 将结果转成纯 javascript 对象。

启用 lean 选项的查询返回的文档是纯 javascript 对象,而不是 Mongoose 文档。它们没有 save 方法、getter/setter、virtuals 或其他 Mongoose 特性。

1
2
3
4
5
6
new Query().lean() // true
new Query().lean(true)
new Query().lean(false)

const docs = await Model.find().lean();
docs[0] instanceof mongoose.Document; // false

参考

  1. 关于mongoose返回的数据无法修改的原因以及解决方法
  2. Mongoose返回数据修改中遇到的坑
  3. https://mongoosejs.com/docs/api/query.html#query_Query-lean