Mongoose:MongoDB 数据库 Node.js ORM 基础操作

Mongoose 是一个 Node.js 的 ORM(对象关系映射)库,用于操作 MongoDB 数据库。它提供了高效的查询构建、模型定义、生命周期钩子等功能,同时也兼容各种 Node.js 框架,如 Express、Koa 等。本文将介绍 Mongoose 的基础操作,包括连接、模型定义、查询、更新、删除等。

连接 MongoDB 数据库

在使用 Mongoose 之前,需要先连接 MongoDB 数据库。我们可以使用 mongoose.connect() 方法进行连接,同时还可以设置一些连接选项,如:

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

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

其中,mongodb://localhost/myDB 表示连接本地的 myDB 数据库。其他参数的含义如下:

  • useNewUrlParser: 使用新的 URL 解析器,避免出现 URL 解析错误。
  • useUnifiedTopology: 使用新的连接管理引擎,避免出现奇怪的连接错误。
  • useCreateIndex: 在定义模型时自动创建索引,避免手动创建索引时出错。
  • useFindAndModify: 使用新的查找和修改引擎,避免出现过去版本的问题。

定义模型

在 Mongoose 中,模型是指与数据库中的集合(collection)相对应的构造函数。我们可以使用 mongoose.Schema 方法定义集合的 Schema(结构),再使用 mongoose.model 方法将 Schema 转换为模型,如:

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

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

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

其中,userSchema 定义了集合的结构,包括用户名、邮箱、密码、创建时间和更新时间等字段。User 是将 userSchema 转换为模型后的构造函数,即与集合相对应的模型。

查询操作

Mongoose 提供了丰富的查询操作,包括条件查询、投影查询、排序查询、分页查询、聚合查询等。下面分别介绍这些操作。

条件查询

条件查询是指根据指定的条件对集合进行查询,常用的条件操作符包括 $eq$ne$gt$lt$gte$lte$in$nin$or$and$not 等。举个例子:

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

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

其中,findOne() 方法用来查询满足条件的第一个文档,返回一个 Promise 或者执行回调函数,取决于是否传入回调函数。如果查询失败,将返回 err 错误。

投影查询

投影查询是指根据指定的字段对集合进行查询,可以使用 select() 方法指定需要查询的字段,也可以使用 exclude() 方法指定需要排除的字段。举个例子:

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

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

其中,select() 方法指定需要查询的字段,用空格分隔多个字段名;exclude() 方法指定需要排除的字段,也用空格分隔多个字段名。

排序查询

排序查询是指根据指定的字段对集合进行排序,可以使用 sort() 方法指定排序条件,如:

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

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

其中,sort() 方法用来指定排序条件,如果要进行降序排序,可以在字段名前面加上 - 符号。

分页查询

分页查询是指对集合进行分页查询,可以使用 skip() 方法跳过指定数量的文档,再使用 limit() 方法限制查询结果的数量,如:

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

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

其中,skip() 方法用来跳过指定数量的文档,limit() 方法用来限制查询结果的数量。

聚合查询

聚合查询是指对集合进行复杂的计算和处理,可以使用 aggregate() 方法实现,支持各种聚合操作符,如 $group$sort$project$match$lookup 等。举个例子:

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

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

其中,$lookup 是用来关联集合的操作符,用来将 users 集合关联到 comments 集合上;$project 是用来投影字段的操作符,用来计算每个用户的评论总数;$sort 是用来排序的操作符,用来按照评论总数降序排列。

更新操作

更新操作是指对集合中的文档进行更新,可以使用 updateOne()updateMany()findOneAndUpdate()findByIdAndUpdate() 等方法进行更新。举个例子:

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

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

其中,updateOne() 方法用来更新满足条件的第一个文档,updateMany() 方法用来更新满足条件的所有文档,findOneAndUpdate() 方法用来查询并更新满足条件的第一个文档,findByIdAndUpdate() 方法用来根据 ID 查询并更新对应的文档。

删除操作

删除操作是指对集合中的文档进行删除,可以使用 deleteOne()deleteMany()findOneAndDelete()findByIdAndDelete() 等方法进行删除。举个例子:

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

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

其中,deleteOne() 方法用来删除满足条件的第一个文档,deleteMany() 方法用来删除满足条件的所有文档,findOneAndDelete() 方法用来查询并删除满足条件的第一个文档,findByIdAndDelete() 方法用来根据 ID 查询并删除对应的文档。

总结

本文介绍了 Mongoose 的基础操作,包括连接、模型定义、查询、更新、删除等。Mongoose 提供了丰富的查询操作,支持条件查询、投影查询、排序查询、分页查询、聚合查询等,可以满足各种复杂的需求。同时,Mongoose 还提供了简单易用的更新和删除方法,方便开发者对数据进行操作。对于 MongoDB 数据库的使用者来说,掌握 Mongoose 的基础操作是非常必要的。

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


猜你喜欢

  • React Native 中的常见错误和解决方案总结

    React Native 是一个基于 React 的多平台开发框架,它以 JavaScript 和 React 为基础,在移动平台上快速构建高性能且具有原生应用体验的应用程序。

    1 年前
  • TCP/IP 协议性能优化实践

    TCP/IP 是一个网络协议栈,它包含多个层级,其中 TCP 和 IP 是其中最重要的两个协议。在前端开发中,网络传输是非常重要的一部分,因此了解 TCP/IP 协议以及如何优化网络性能是非常必要的。

    1 年前
  • PM2 监控 Node.js 进程的状态,保障应用稳定性

    介绍 Node.js 是一种基于事件驱动、异步I/O 的服务器端技术,它在Web开发中被广泛应用。PM2 是一个用于Node.js应用程序的生产级进程管理器,它可以监控、管理、组织及运行Node.js...

    1 年前
  • 前端 SPA 单页应用中的事件委托和代理机制详解

    前端开发中,常常需要给页面上的元素加上事件,比如点击、滚动等等。但是当页面上的元素过多时,为每个元素都加上相同的事件处理函数会导致代码冗余,而且会占用大量内存空间,从而影响网页性能。

    1 年前
  • ES6 中的数组方法 sort 的使用方法及示例

    JavaScript 是一门广泛用于前端开发的语言,而数组是 JavaScript 中最常用和最基础的数据结构之一,它可以轻松地存储和操作多个值。而在 ES6 中,提供了一系列新增的数组方法,其中 s...

    1 年前
  • Kubernetes 部署 NFS 服务,解决共享存储问题

    前言 在 Kubernetes 集群中,存储是非常重要的一个问题,在多个容器之间进行共享存储可以更好地协调不同的服务。本文将介绍 Kubernetes 部署 NFS 服务,以便进行共享存储,解决 Ku...

    1 年前
  • 选择 Koa2 框架,实现一个利用内存的本地缓存服务

    在前端开发中,使用缓存技术可以大大提高网站的性能和用户体验。但是,对于一些小规模的网站或应用,使用像 Redis 这样的外部缓存服务器可能过于复杂和昂贵,这时候我们可以选择使用内存作为本地缓存。

    1 年前
  • Redis 分布式缓存之数据一致性解决方案:使用分布式锁与版本号控制实现数据一致性

    Redis 是一款流行的内存缓存数据库,具有高效、可靠、灵活等特点。在分布式系统中,利用 Redis 可以实现数据共享、数据缓存、并发控制等功能。但是,在分布式环境下,不同服务器之间数据的一致性是必须...

    1 年前
  • CSS Grid 布局实现复杂表格技巧教程

    CSS Grid 布局是现代前端开发中最强大的布局方式之一,它可以非常灵活地实现各种复杂的布局要求。本篇文章将详细介绍如何使用 CSS Grid 布局实现复杂的表格布局。

    1 年前
  • 使用 Socket.io 实现快速开发 Web 应用的先决条件

    使用 Socket.io 实现快速开发 Web 应用的先决条件 什么是 Socket.io? Socket.io 是一个基于 Node.js 的实时、双向、事件驱动的通信库,用于浏览器与服务器之间的通...

    1 年前
  • 如何使用 RxJS 实现异步数据流

    引言 随着 Web 应用与 PC 应用的复杂度不断提高,很多业务场景需要处理更加复杂的异步事件,这些事件存在依赖、过滤、合并等复杂的逻辑操作。 RxJS 作为响应式编程的一种实现方式,为我们带来了一种...

    1 年前
  • 解决使用 Custom Elements 实现的 Tab 组件在低版本安卓机上闪退的问题

    背景 在前端开发中,Tab 组件是一种常见且易用的 UI 组件。通过 Custom Elements 的实现,我们可以封装自己的 Tab 组件并实现一些高级特性。但是,在低版本的安卓设备上,我们会发现...

    1 年前
  • 通过使用 Tailwind CSS 提高项目开发效率的技巧

    Tailwind CSS 是一款功能强大且高度可定制的 CSS 框架,可以大大提高前端项目开发的效率。本文将讨论使用 Tailwind CSS 的一些技巧,包括使用自定义配置、集成工具和网格系统。

    1 年前
  • 如何用 Flask 实现 RESTful API

    在前端开发中,RESTful API 是一种非常常见的接口设计风格。该风格用于规范 API 的 URI、HTTP 动词、请求和响应格式等方面的设计,使得 API 更加易于理解和使用。

    1 年前
  • Web Components 中插件开发流程与如何进行插件管理

    Web Components 是一种用于构建可复用组件的技术,通过自定义元素、Shadow DOM 和 HTML 模板,使得组件更加独立、易于重用和维护。在 Web Components 中,很多组件...

    1 年前
  • 使用 Enzyme 测试 React 组件的标准流程

    1. 什么是 Enzyme Enzyme 是 React 生态系统中一个流行的测试工具库,它提供了一些用于测试 React 组件的功能和实用程序。 使用 Enzyme 可以编写 UI 组件测试,包括渲...

    1 年前
  • Chai 使用中遇到 "this.sandbox is not a function" 的解决方法

    在前端开发中常常需要进行测试,而 Chai 是一款常用的断言库。但在使用过程中可能会遇到 this.sandbox is not a function 错误,这个问题是什么原因导致的,有哪些解决方法呢...

    1 年前
  • PWA 技术实战 | 如何处理网络异常和错误的情况?

    Progressive Web App (PWA) 能够以纯 Web 应用程序的方式提供用户具备原生应用程序般的体验。但是,网络异常和错误情况的处理对于 PWA 应用程序非常重要。

    1 年前
  • Flutter 开发中实现 Material Design 风格的折叠式导航栏

    Flutter 是一款快速开发高质量、高性能移动应用的开源框架,具有跨平台、易上手以及支持 Material Design 风格等优点。在 Flutter 开发中,实现折叠式导航栏是十分常见的需求。

    1 年前
  • 使用 GraphQL 批量修改数据 —— 优化 API 的性能

    什么是 GraphQL? GraphQL 是一个用于 API 的查询语言。它建立在类型系统之上,并允许您在客户端明确地指定您需要的内容,从而使 API 更加高效和强大。

    1 年前

相关推荐

    暂无文章