Mongoose 是一个前端领域广泛使用的 MongoDB ODM(对象文档映射器)库,旨在简化 MongoDB 数据存储的过程。在使用 Mongoose 的过程中,Model 和 Schema 是重要的知识点,本文将详细介绍它们的标准写法、使用方法以及相关实例代码。
Model
在 MongoDB 中,数据存储在集合(Collection)中,并且集合是没有 Schema 的。但是,在使用 Mongoose 时,我们需要为指定的集合定义一个 Model 类。Model 是应用程序与数据库之间的接口,它表示一个集合,并且具有许多方法可以用于查询和操作数据。
定义 Model
定义一个 Model 类需要使用 mongoose.model() 方法,该方法需要传递两个参数,第一个参数为集合的名称(会自动转化为小写且加上 s 后缀),第二个参数为该集合的 Schema。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---------- - --- ----------------- ----- ------- ---- ------- ------ ------ --- ----- ---- - ---------------------- ------------
上述代码中,定义了一个名为 User 的 Model 类,对应的集合为 users,该集合拥有三个字段:name(字符串类型)、age(数值类型)和 email(字符串类型)。Schema 会根据定义的字段来限制插入和更新数据的格式。
增加数据
使用 Model 的 create() 方法可以很方便地添加一条数据:
-- -------------------- ---- ------- ----- ---- - - ----- -------- ---- --- ------ ------------------- -- ----------------- ------------- ---- - -- ----- - ----------------- - ---- - ----------------- - ---
上述代码中,create() 方法将一个包含数据的对象作为参数,然后产生一个文档并将其保存到 MongoDB 中。回调函数中,如果有错误则会打印出来,否则会打印刚刚添加的数据。
查询数据
Mongoose 提供了一系列用于查询数据的方法,包括 find()、findOne()、findById() 等。以 find() 方法为例,可以如下地查询所有年龄大于 20 的用户:
User.find({ age: { $gt: 20 } }, function(err, docs) { if (err) { console.log(err); } else { console.log(docs); } });
更新数据
使用 Model 的 update() 方法可以更新集合中的数据:
User.update({ name: 'Peter' }, { $set: { email: 'new_peter@example.com' } }, function(err) { if (err) { console.log(err); } else { console.log('Data updated'); } });
上述代码中,使用 $set 操作符将 Peter 的电子邮件地址更新为 new_peter@example.com。
删除数据
使用 Model 的 remove() 方法可以删除集合中的数据:
User.remove({ age: { $lt: 18 } }, function(err) { if (err) { console.log(err); } else { console.log('Data removed'); } });
上述代码中,删除年龄小于 18 的用户。
Schema
Schema 是 Mongoose 中的关键概念之一。它定义了集合中每个文档的格式,包括文档的属性、默认值、验证规则等等。在定义 Schema 时,需要使用 mongoose.Schema() 将文档结构定义为一个 JavaScript 对象。
定义 Schema
定义一个最简单的 Schema 可以如下所示:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, age: Number, email: String });
该 Schema 定义了一个名为 User 的集合,其中包括一个 name、一个 age 和一个 email 属性,它们的类型分别是字符串、数值和字符串。
默认值
在定义 Schema 时,还可以指定每个属性的默认值,如下例所示:
const userSchema = new mongoose.Schema({ name: { type: String, default: '' }, age: { type: Number, default: 0 }, email: { type: String, default: '' }, admin: { type: Boolean, default: false } });
上述代码中,如果在添加数据的时候某个字段没有指定,则 Mongoose 将使用上述规则为该字段设置默认值。
验证规则
在定义 Schema 时,还可以定义验证规则以确保文档中的数据合法。常见的验证规则包括 required、minlength、maxlength、min、max、match 等。以下是一个示例:
const userSchema = new mongoose.Schema({ name: { type: String, required: true }, age: { type: Number, min: 18, max: 65 }, email: { type: String, match: /^[\w-]+@([\w-]+\.)+[\w-]{2,4}$/ } });
上述代码中,定义了一个 users 集合,其中 name 属性必填、age 属性取值范围为 18 到 65 之间、email 属性必须符合正则表达式 /^[\w-]+@([\w-]+.)+[\w-]{2,4}$/。
虚拟属性
虚拟属性(Virtuals)是 Mongoose 中的一个高级特性,它们允许您定义实体的属性,这些属性可以计算得出,而不必专门存储在您的 MongoDB 数据库中。示例代码如下:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ----- ------- ------ ------ --- --------------------------------------------- - ------ --------------- - - - - --------------- ------------------------- - ----- ----- - ---------------- --- --------------- - --------- -------------- - --------- --- ----- ---- - ---------------------- ------------ ----- ---- - --- ------ ----- - ------ ------- ----- ----- -- ------ ---------------------- --- --------------------------- -- ---- --- ------------- - ----- ----- ----------------------------- -- ---- ---------------------------- -- ---
上述代码中定义了一个 User 的 Schema,并在其中定义了一个虚拟属性 fullName。在使用 get 和 set 方法时,需要使用 this 关键字来获取或设置当前文档的属性。
总结
本文详细介绍了在 Mongoose 中定义 Model 和 Schema 的标准方式,同时介绍了其相关的代码示例。希望本文对您更深入理解 Mongoose 的使用和技术实现有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6450650f980a9b385b972cd8