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