Express.js 中的 Mongoose 数据库查询操作详解

阅读时长 5 分钟读完

Mongoose 是一个 Node.js 中用于操作 MongoDB 的 Object-Document Mapping (ODM) 库,它提供了丰富的 API 和强大的数据验证、查询和处理能力。在 Express.js 应用程序中使用 Mongoose 可以非常方便地操作数据库,本文将介绍 Mongoose 中的数据库查询操作详解,帮助初学者深入理解和掌握 Mongoose 的使用。

连接数据库

使用 Mongoose 操作 MongoDB 之前,需要先连接到数据库。连接过程如下:

其中 mongodb://localhost/my_database 是 MongoDB 的连接字符串,useNewUrlParser: true 表示使用新版 MongoDB 驱动器进行解析,这是必要的。

定义模式和模型

在 Mongoose 中,数据存储在集合 (Collection) 中,每个集合都对应着一个模型 (Model),模型定义了集合的结构、字段类型和默认值等等。在定义模型之前需要先定义模式 (Schema),并将模式和集合进行绑定。例如定义一个简单的博客文章模型可以这样:

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

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

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

在这个例子中,我们定义了一个名为 Article 的模型,它关联到 articles 集合,同时定义了包含 titlecontentcreatedAt 字段的模式。注意,model 函数的第一个参数是模型的名称,会被自动用作集合的名称,所以不需要手动指定集合名称。

查询操作

Mongoose 中的查询操作可以非常方便地进行复杂的数据库查询和条件筛选。基本的查询操作如下:

查询所有文档

这个代码片段会查询 articles 集合中的所有文档,并将结果存放在 articles 数组中。如果查询成功,err 将会是 null,否则会是一个错误对象。

按条件查询文档

使用 find() 函数可以按照指定条件查询文档:

这个代码片段会查询 title 字段为 Mongoose Tutorial 的文档,并将结果存放在 articles 数组中。

条件组合查询

可以使用逻辑运算符 $and$or$nor$not 或者 $in$nin$gt$gte$lt$lte 等运算符进行条件组合查询:

这个代码片段会查询 title 字段为 Mongoose Tutorial 或者 Node.js Tutorial 的文档,并将结果存放在 articles 数组中。

查询单个文档

使用 findOne() 函数可以查询符合条件的第一个文档:

这个代码片段会查询 title 字段为 Mongoose Tutorial 的第一个文档,并将结果存放在 article 变量中。

查询文档数量

使用 count() 函数可以查询符合条件的文档数量:

这个代码片段会查询 title 字段为 Mongoose Tutorial 的文档数量,并将结果存放在 count 变量中。

排序查询结果

可以使用 sort() 函数对查询结果进行排序:

这个代码片段会查询 articles 集合中的所有文档,并按照 createdAt 字段进行降序排列,将结果存放在 articles 数组中。

分页查询

可以使用 skip()limit() 函数对查询结果进行分页:

这个代码片段会查询 articles 集合中的所有文档,从第 21 条开始,取出 10 条记录,并将结果存放在 articles 数组中。

使用正则表达式查询

可以使用正则表达式进行模糊查询:

这个代码片段会查询 title 字段包含 Tutorial 字符串的所有文档,并将结果存放在 articles 数组中。

总结

本文介绍了如何在 Express.js 应用程序中使用 Mongoose 数据库查询操作。学习使用 Mongoose 可以极大地提高开发效率,同时还提供了很多方便的开发工具和数据处理能力,帮助我们更好地构建 Web 应用程序。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ab586a48841e989472bb2a

纠错
反馈