Mongoose 中的 lean() 方法能够提高性能,但它对查询结果有何影响?

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

Mongoose 中的 lean() 方法能够提高性能,但它对查询结果有何影响?

在开发 Node.js 项目的过程中,Mongoose 是一个常用的 ODM(Object Data Mapping)框架,它允许开发者使用 JavaScript 语言操作 MongoDB 数据库。当数据量比较庞大时,查询性能将是一个问题。Mongoose 中的 lean() 方法能够提高查询性能,但要注意它对查询结果的影响。

lean() 方法是 Mongoose 用以获取原生 JavaScript 对象的方式。它可以较大地提高性能,因为不用依赖 Mongoose 的文档对象(Document对象)的 API,则无需花费时间进行转化。

当我们使用 lean() 方法时,查询的结果不是 Mongoose 的文档对象,而是纯粹的 JavaScript 对象。这代表着我们将会失去一些为文档对象准备的异步方法和一些 Mongoose 的内置虚拟属性。使用 lean() 方法可以省下这些内存占用,其中牺牲的部分是无法避免的。

使用示例:

假设我们在查询所有学生的信息以及它们所在班级的信息(类似于 JOIN 操作)。

我们可以使用下面的代码进行查询。

----- -------- - --------------------

----- ------------- - --- -----------------
  ----- - ----- ------- --------- ---- --
  ---- - ----- ------- --------- ---- --
  ------ - ----- ------------------------ ---- ------- -
---

----- ----------- - --- -----------------
  ----- - ----- ------- --------- ---- --
  --------- - ----- ------- --------- ---- -
---

----- ------------ - ------------------------- ---------------
----- ---------- - ----------------------- -------------

----- -------- ------------- -
  ----- -------- - ----- --------------------------------------

  ----------------------

  -- 
    -
      -
        ------ ---------------------------
        ------- -------
        ------ ---
        -------- -
          ------ ---------------------------
          ------- ---------
          ----------- ----- -----
          ------ -
        --
        ------ -
      --
      -
        ------ ---------------------------
        ------- -------
        ------ ---
        -------- -
          ------ ---------------------------
          ------- ---------
          ----------- ----- -----
          ------ -
        --
        ------ -
      -
    -
  --
-

在上面的代码中,我们使用了 populate() 方法,通过 class 属性中的 mongoose.Types.ObjectId 类型的 id 去访问 ClassModel,查询出 class 对象的信息。

但是当数据量变大时,查询时间会变得非常耗时,我们可以使用 lean() 方法代替 populate() 方法进行优化。

改进后的代码:

----- -------- ------------- -
  ----- -------- - ----- ------------------------------------- ----- -------- ------- -------- ----------- ---

  ----------------------

  --
    -
      -
        ------ ---------------------------
        ------- -------
        ------ ---
        -------- -
          ------ ---------------------------
          ------- ---------
          ----------- ----- ----
        -
      --
      -
        ------ ---------------------------
        ------- -------
        ------ ---
        -------- -
          ------ ---------------------------
          ------- ---------
          ----------- ----- ----
        -
      -
    -
  --
-

我们可以看到,使用 lean() 方法的查询结果并不是文档对象,而是纯粹的 JavaScript 对象。在这个例子中,查询时间将会缩短。同时,我们可以通过 populate() 方法指定我们需要的属性,避免占用无用的内存。

需要注意的是,在使用 lean() 方法时,我们无法使用 findOneAndUpdate(),findOneAndDelete(),findByIdAndUpdate() 和 findByIdAndDelete() 等方法。因为它们都依赖于文档对象来保存查询结果。因此,在使用 lean() 方法时,可以考虑使用 updateOne() 和 deleteOne() 等原生的 MongoDB 方法。

总结:

lean() 方法是一个非常实用的查询优化方法,但是我们需要根据具体情况来考虑是否使用。在查询结果较大的时候,使用 lean() 方法将能够提升查询性能,同时我们需要注意到,使用 lean() 方法不能同时使用文档对象的一些异步方法和 Mongoose 的内置虚拟属性。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/65b358beadd4f0e0ffc6880d


猜你喜欢

  • 利用 Kubernetes 在云端部署 Elk

    在现代化的系统架构中,日志管理系统变得越来越重要,而 ELK(Elasticsearch、Logstash、Kibana)套件则成为了一个备受欢迎的解决方案。随着云计算技术的不断发展,越来越多的企业开...

    9 个月前
  • 如何实现自定义的 CSS Reset 样式表

    在前端开发中,很多时候需要去除默认的浏览器样式,使用自定义样式,这就需要用到 CSS Reset 样式表。CSS Reset 定义了一系列的通用样式,可覆盖浏览器默认样式。

    9 个月前
  • 在 Koa2 中如何开发 RESTful API

    什么是 RESTful API REST 是Representational State Transfer的缩写,即表示状态转移,它是一种通信架构,用于建立网络应用程序之间的通信,而 RESTful ...

    9 个月前
  • Cypress 自动化测试实践:使用 fixtures 实现数据驱动

    前言 Cypress 是一个先进的端到端测试框架,它可以让开发者更便捷地进行前端自动化测试。 在进行自动化测试中,往往需要准备测试数据。不同的测试用例需要不同的测试数据,这就需要我们能够动态地传递测试...

    9 个月前
  • 如何优雅地处理 Next.js 中遇到的 404 页面错误?

    对于 Next.js 开发者来说,处理 404 页面错误是一个常见的问题。当用户访问一个不存在的页面时,Next.js 默认会显示一个简单的 404 页面,没有任何提示和反馈。

    9 个月前
  • 利用 ECMAScript 2020 的 import.meta.url 获取模块 URL

    在前端开发中,我们经常需要获取当前正在执行的脚本所在的 URL,以便进行一些动态加载资源的操作,例如使用 Ajax 请求配置文件或者动态加载图片等。在过去,我们一般采用 document.curren...

    9 个月前
  • ECMAScript 2018 中的对象扩展 Rest/Spread 属性的使用技巧

    随着前端技术的不断发展,ECMAScript 的版本也在不断更新。其中,ECMAScript 2018 中引入了 Rest/Spread 属性,为开发者们带来了更多灵活性和效率。

    9 个月前
  • RxJS 中使用 takeUntil 实现取消订阅

    在前端开发过程中,接触到的异步事件非常常见,而 RxJS 作为一种常用的响应式编程库,可以很好地处理异步事件。RxJS 提供了多种操作符用于处理响应式流数据,其中使用 takeUntil 操作符可以轻...

    9 个月前
  • 高性能 Java:构建快速并发应用程序的几种方法

    高性能 Java:构建快速并发应用程序的几种方法 Java 是一种高效的编程语言,尤其在并发编程方面表现出色。然而,为了实现高性能的并发应用程序,需要采用一些特定的技术。

    9 个月前
  • 在 Headless CMS 中集成 Markdown 编辑器的方法

    前言 Headless CMS 是目前比较流行的一种内容管理系统,在最近几年得到了广泛的应用。与传统的 CMS 不同,Headless CMS 只关注内容的管理和存储,不涉及任何展示层面的设计和开发。

    9 个月前
  • 使用 Babel 编译 ES6 代码时如何避免 “missing import 'default'” 的错误

    引言 ES6 是 JavaScript 的一个重大更新,它引入了很多新的语言特性。尽管它带来了一些令人激动的新功能,但它也带来了一些常见的问题。这篇文章将着重讨论在使用 Babel 编译 ES6 代码...

    9 个月前
  • Sequelize 查询 Where 语句参数化绑定的使用方法

    前言 当我们在使用 Sequelize 构建应用程序时,查询数据库是不可避免的。在查询中,Where 语句是非常常见的,而参数化绑定可以防止 SQL 注入攻击,提高应用安全性。

    9 个月前
  • ES6 中的严格模式使用注意事项

    随着 JavaScript 的不断发展,ES6 在语言层面上提供了更多的新特性和语法,其中严格模式是一个非常重要的特性。通过使用严格模式,我们可以让 JavaScript 的行为更加纯净、安全和可预测...

    9 个月前
  • 解决 Koa2 中的跨域问题

    在前端开发过程中,跨域是一个常见的问题。在 Koa2 中,由于其默认的安全性设置,会对跨域进行一些限制,对于开发人员而言,需要针对这些限制采取相应的措施。 跨域的概念 跨域是指从一个域名的页面去请求另...

    9 个月前
  • 详解 Kubernetes High Availability(HA)架构

    Kubernetes是目前最流行的容器编排平台,为了保证稳定性和可用性,Kubernetes引入了HA(高可用性)架构。本文将仔细解释什么是 Kubernetes HA架构,为什么我们需要它,以及如何...

    9 个月前
  • Redux 实战 —— 电商模块

    Redux 是 React 生态圈中重要的一个库,用于管理应用程序的状态。本文将介绍如何在电商模块中使用 Redux,实现状态的统一管理。 安装 Redux 使用 npm 或 yarn 进行安装: -...

    9 个月前
  • 如何在 Angular 项目中使用 Tailwind

    介绍 在 Web 应用程序中,UI 是非常重要的一部分。而对于前端开发人员来说,CSS 是实现好看的 UI 的基础。然而,CSS 的书写方式比较繁琐,因此出现了一些 CSS 框架来帮助开发人员快速实现...

    9 个月前
  • ESLint 报告 'url' is not defined

    前言 前端开发中,我们经常使用一些全局变量,例如 window、document 等。然而在使用 ESLint 时,遇到了这样的问题:url is not defined。

    9 个月前
  • 优秀的 Next.js 实战教程:修复 “Error: No router instance found” 错误

    背景 Next.js 是一个 React 框架,它提供了很多有用的功能,例如自动代码拆分、服务器渲染等。在实际项目中,我们可能会遇到一些问题,比如 “Error: No router instance...

    9 个月前
  • 解决 Sass 编译过程中出现 “Undefined variable…” 错误

    问题描述 在使用 Sass 编写样式时,有可能会出现“Undefined variable…” 的错误,例如: --------------- ----- --------- - ------ -...

    9 个月前

相关推荐

    暂无文章