在 Node.js 和 MongoDB 开发中,Mongoose 是一个广受欢迎的 ORM(对象关系映射)库,它可以让我们在代码中轻松地管理 MongoDB 数据库,实现与数据库的交互。
然而,Mongoose 查询可能会造成性能问题,因为 Mongoose 的查询默认返回 Mongoose 文档,这给文档带来了一些附加的开销。但是,如果你知道怎么使用 lean 方法,你可以大大加快查询速度。
在本文中,我们将探讨如何使用 Mongoose 的 lean 方法来提高查询效率,以及如何使用该方法的最佳实践。
什么是 lean 方法?
lean 方法是 Mongoose 的一个内置方法,它使查询结果不再是 Mongoose 文档对象,而是纯 JavaScript 对象,减少了处理数据的时间和内存的使用。
当你使用 lean 方法,Mongoose 会在不使用模型的附加信息(如 getters 和 setters)或不进行修改的情况下,立即将查询结果返回给你。
如何在 Mongoose 中使用 lean 方法
Mongoose 的查询可以使用 lean() 方法。在查询执行后,lean 将返回一个 JavaScript 对象而不是 Mongoose 文档对象。以下是一个使用 lean 方法的示例代码:
const User = require('./models/user'); User.find().lean().exec(function(error, result) { // Do something with the result });
请注意,不要在 lean 查询后使用 Mongoose 文档方法,因为结果是从数据库中获取的 JavaScript 对象,而不是 Mongoose 文档。如果你需要使用文档方法,则应在 lean 查询之前执行。
这是一个错误的示例代码:
const User = require('./models/user'); User.find().lean().exec(function(error, result) { result.forEach(function(user) { console.log(user.getName()); // TypeError: user.getName is not a function }); });
正确的方式是这样的:
const User = require('./models/user'); User.find().exec(function(error, result) { result.forEach(function(user) { console.log(user.getName()); // works, since `user` is a Mongoose document }); });
lean 的一些注意点
虽然 lean 方法可以显著提高查询效率,但它也有一些注意点,需要在使用时留意。
缺失附加方法
由于 lean 方法返回的是纯 JavaScript 对象,因此所有的模型方法都不能使用。如果你需要使用模型方法,你需要确保你在执行 lean 方法之前使用所有的必要方法。
只接受可选查询选项
lean 方法不支持选项,例如 select()
、where()
、populate()
。虽然查询选项与文档内容无关,但我们需要在 lean 方法之前使用它们。
因此,下面这个例子是不可行的:
const User = require('./models/user'); User.find().select('name').lean().exec(function(error, result) { // Do something });
正确的方式应该是这样的:
const User = require('./models/user'); User.find().select('name').exec(function(error, docs) { const result = docs.map(doc => doc.toObject()); // Do something with the result });
无法使用虚拟属性
虚拟属性是从一个字段中派生出的文档属性。它们通常是作为本地计算属性一起使用的。
由于 lean 方法返回的对象是纯 JavaScript 对象,因此无法使用虚拟属性。
如果您需要使用虚拟属性,请完全不要使用 lean()。
总结
Mongoose 中使用 lean 方法可以提高查询效率,特别是在找大量数据时。
总的来说,如果你需要处理渲染模板、大量数据或其他类似情况,将查询结果转换为 JavaScript 对象可能是一个更好的选择。同时,你应该在调用 lean() 方法之前全部使用必要的查询选项和方法。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f28fbcf6b2d6eab3c31df5