Mongoose 是一个 Node.js 的 MongoDB 对象模型工具,它提供了一系列的 API,用于和 MongoDB 进行交互。其中,Schema 是 Mongoose 中一个很重要的概念,它用于定义数据的结构和类型。在本文中,我们将详细介绍 Mongoose 中如何使用 Schema 定义数据类型,并提供一些示例代码和学习指导。
什么是 Schema?
在 Mongoose 中,Schema 是一种用于定义数据结构的类。它定义了数据类型、默认值、验证器等信息,用于生成 Model。Model 是指与数据库中的集合对应的类,它可以执行 CRUD 操作,即对集合中的文档进行增删改查。
可以将 Schema 理解为表单,Model 理解为填写表单的人。表单规定了填写的内容和格式,填写人必须按照规定的格式填写,否则会被提示错误。同样地,Schema 规定了文档的结构和类型,Model 必须遵守 Schema 的规定,否则会导致操作失败。
如何使用 Schema 定义数据类型?
定义 Schema 的过程分为两个步骤:定义 Schema,生成 Model。下面我们分别来介绍这两个步骤。
定义 Schema
定义 Schema 一般需要使用到 Mongoose 中的 Schema 类。在使用之前,我们需要先安装 Mongoose:
$ npm install mongoose
然后在代码中引入 Mongoose:
const mongoose = require('mongoose');
接着,我们就可以创建 Schema 了。以定义用户信息为例,代码如下:
const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, isAdmin: Boolean, created_at: { type: Date, default: Date.now }, updated_at: { type: Date, default: Date.now }, });
在上面的代码中,我们定义了一个名为 userSchema 的 Schema,它有六个属性。其中,前四个属性的类型分别为 String、Number、String、Boolean,而最后两个属性的类型为 Date,且都有默认值,分别为当前时间。
除了上面提到的属性类型和默认值外,还有很多其它的属性可以设置,比如:required、unique、enum、max、min 等。这些属性的具体用法可以参考 Mongoose 的官方文档。
生成 Model
生成 Model 一般需要使用到 Mongoose 中的 model() 方法。在使用之前,我们需要先连接 MongoDB:
mongoose.connect('mongodb://localhost:27017/myapp', { useNewUrlParser: true });
上面的代码中,我们连接了名为 myapp 的数据库。如果该数据库不存在,则会自动创建。
然后,我们就可以使用 model() 方法来创建 Model 了。以生成名为 User 的 Model 为例,代码如下:
const User = mongoose.model('User', userSchema);
在上面的代码中,我们使用 model() 方法,传入两个参数:第一个参数为 Model 的名称,即 User;第二个参数为之前定义的 Schema,即 userSchema。
在生成 Model 后,我们就可以使用它来执行 CRUD 操作了。比如,向 User 集合中插入一条文档的代码如下:
const user = new User({ name: 'Joe', age: 20, email: 'joe@example.com', isAdmin: false }); user.save();
在上面的代码中,我们创建了一个名为 user 的文档,并调用了 save() 方法来保存它。save() 方法是异步的,它会在保存完成后调用回调函数。如果保存失败,则回调函数中的 err 参数不为空。
同样地,我们也可以使用其它的方法来执行查询、更新和删除等操作。具体用法可以参考 Mongoose 的官方文档。
总结
本文介绍了 Mongoose 中如何使用 Schema 定义数据类型,并提供了一些示例代码和学习指导。需要注意的是,Schema 只是定义了数据类型和结构,实际操作还需要使用 Model 来进行。除了本文介绍的方法外,还有很多其它的方法可以使用,如果遇到问题,可以参考 Mongoose 的官方文档或社区论坛。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654c3a9c7d4982a6eb5d4e01