Mongoose 是 Node.js 中用于在 MongoDB 中定义数据模型和进行数据库操作的一个库,它提供了丰富的 API 和许多方便的功能。在 Mongoose 中,Model 是一个表示 MongoDB 集合的构造函数,使用它可以定义集合的结构和行为,并进行各种增删改查操作。本文将详细介绍 Mongoose 中的 Model 方法,包括创建、查询、删除等操作,并提供示例代码和实际应用场景,以供参考和学习。
创建 Model
Mongoose 是基于 Schema 的,定义 Model 之前需要先定义 Schema。Schema 是一个用于定义集合的文档结构的对象,可以包含字段的类型、验证规则、默认值等信息。在定义 Schema 后,可以使用 mongoose.model()
方法创建 Model,该方法接受两个参数,第一个参数是 Model 的名称,第二个参数是对应的 Schema。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ---------------- ----- ---------- - --- -------- ----- ------- ---- ------- ------ ------ --- ----- --------- - ---------------------- ------------
以上代码定义了一个名为 User
的 Model,对应的 Schema 包含了三个字段:name
、age
和 email
。Model 的名称将用于操作该集合。
查询 Model
查询 Model 是 Mongoose 中最常用的操作之一,除了常见的 CRUD 操作之外,还支持条件查询、排序、分页等高级功能。Mongoose 中的查询方法都是通过 Model
构造函数的静态方法实现的,常用的有 find()
、findOne()
、update()
、deleteOne()
和 deleteMany()
等。
find()
find()
方法用于查询符合条件的多个文档,可以指定查询条件、返回字段和排序方式。查询条件可以使用对象、正则表达式等方式指定,返回字段可以使用投影操作符 $project
指定,排序方式可以使用 $sort
操作符指定。
UserModel.find({ age: { $lt: 30 } }, { email: 1 }).sort({ name: 1 }).exec((err, docs) => { if (err) { console.error(err); } else { console.log(docs); // 返回所有 age 小于 30 的文档中的 email 字段,按 name 升序排列 } });
上述代码查询了所有 age
小于 30 的文档中的 email
字段,只返回 email
字段,并按照 name
升序排列。
findOne()
findOne()
方法用于查询符合条件的单个文档,和 find()
方法的使用方式类似,但只返回第一个匹配的文档。查询条件、返回字段和排序方式也可以使用相应的选项指定。
UserModel.findOne({ name: '张三' }, { name: 1, age: 1 }).exec((err, doc) => { if (err) { console.error(err); } else { console.log(doc); // 返回名字为张三的文档中的 name 和 age 字段 } });
上述代码查询了名字为 张三
的文档中的 name
和 age
字段。
update()
update()
方法用于更新符合条件的文档,可以使用 $set
、$inc
等操作符更新字段的值。更新条件和更新内容都可以使用对象表示,还可以使用 $addToSet
、$push
等操作符更新数组字段。
UserModel.update({ name: '李四' }, { $set: { age: 30 } }, err => { if (err) { console.error(err); } else { console.log('更新成功'); } });
上述代码将名字为 李四
的文档中的 age
字段更新为 30
。
deleteOne()
和 deleteMany()
deleteOne()
和 deleteMany()
方法分别用于删除符合条件的单个文档和多个文档,只需要指定删除条件即可。
UserModel.deleteMany({ age: { $gte: 40 } }, err => { if (err) { console.error(err); } else { console.log('删除成功'); } });
上述代码删除了所有 age
大于等于 40 的文档。
高级查询
除了基本的查询方法之外,Mongoose 中还支持更加灵活的高级查询功能,包括条件查询、文本搜索、聚合查询等。
条件查询
条件查询可以通过各种操作符组合实现,常用的操作符有:
$eq
:等于$ne
:不等于$gt
:大于$gte
:大于等于$lt
:小于$lte
:小于等于$in
:包含在一个数组中$nin
:不包含在一个数组中$exists
:存在该字段$regex
:正则匹配
UserModel.find({ age: { $gt: 20, $lt: 30 }, name: { $regex: /^张/ } }, err => { if (err) { console.error(err); } else { console.log('查询成功'); } });
上述代码查询了所有 age
大于 20 小于 30 并且名字以 张
开头的文档。
文本搜索
Mongoose 中支持对文本字段进行搜索,包括全文搜索和正则表达式匹配搜索。
全文搜索需要先创建一个文本索引,然后使用 $text
操作符进行搜索,可以指定搜索的关键字、语言和权重等参数。
UserSchema.index({ name: 'text', email: 'text' }); UserModel.find({ $text: { $search: '张三' } }, { score: { $meta: 'textScore' } }).sort({ score: { $meta: 'textScore' } }).exec((err, docs) => { if (err) { console.error(err); } else { console.log(docs); // 返回包含张三关键字的文档,按相关度排序 } });
上述代码创建了名字和邮箱字段的文本索引,然后查询包含关键字 张三
的文档,并按照相关度排序。
正则表达式匹配使用 $regex
操作符即可,这个在前面已经提到过了。
聚合查询
聚合查询是 Mongoose 中对数据进行统计和分组的一种高级查询方式,可以用于求和、平均值、分组统计等操作。聚合查询使用 aggregate()
方法,可以链式调用各种聚合操作符,比如 $match
、$group
、$project
、$sort
等。
-- -------------------- ---- ------- --------------------- - ------- - ---- - ---- -- - - -- - ------- - ---- -------- ------ - ----- - - - -- - ------ - ------ -- - -- - ------- -- -- - --------- - ----- ------- ---- -- ------ - - - -- ----- ------- -- - -- ----- - ------------------- - ---- - -------------------- -- ------ -- ------------ -- ----- - ---
上述代码查询了年龄大于 20 的文档,按照名字分组并统计数量,按照数量降序排列后取前 10 个结果进行输出。
Model 方法总结
Mongoose 中的 Model 方法包含了创建、查询、更新、删除等基本操作,以及条件查询、文本搜索、聚合查询等高级操作,提供了方便的操作和强大的功能。在使用 Model 方法时,需要先定义好对应的 Schema 并确保正确性,然后使用静态方法调用相应的操作即可。在实际应用中,需要结合具体的场景和需求进行调整和优化,从而达到更好的用户体验和程序性能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645ad7b7968c7c53b0d25a11