作为 Node.js 开发者,我们时常需要处理数据持久化,并与数据存储进行交互。Mongoose 是一个基于 Node.js 平台的 MongoDB ODM(Object Document Model)工具包,可以使开发者更方便的与 MongoDB 数据库进行交互。在 Mongoose 中,Schema 和 Model 是两个关键的概念,本文将会对这两个概念进行详细解析,以帮助初学者更好的掌握 Mongoose 的使用。
什么是 Schema
Schema 可以理解为数据库的模板或者规则,用于约束数据的格式。在 Mongoose 中,Schema 可以定义集合中的字段类型、默认值、验证等。下面我们通过一个示例来演示如何定义一个 Schema:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const { Schema } = mongoose; const userSchema = new Schema({ name: { type: String, required: true }, // 字段类型为 String,且为必填项 email: { type: String, required: true, unique: true }, // 字段类型为 String,且为必填项,且唯一 age: { type: Number, default: 0 }, // 字段类型为 Number,默认值为 0 createdAt: { type: Date, default: Date.now }, // 字段类型为 Date,默认值为当前时间 });
在上面的代码中,我们定义了一个 userSchema,该 Schema 包含了四个字段,分别是 name、email、age、createdAt,并且每个字段都定义了类型和一些属性。
什么是 Model
Model 是由 Schema 编译生成的构造函数,可以进行 CRUD 操作。在 Mongoose 中,Model 可以看作是数据库中的集合。下面我们通过一个示例来演示如何使用 Schema 创建 Model:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const { Schema } = mongoose; const userSchema = new Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, age: { type: Number, default: 0 }, createdAt: { type: Date, default: Date.now }, }); const UserModel = mongoose.model('User', userSchema);
在上面的代码中,我们使用 mongoose.model 方法来创建一个名为 User 的 Model,该 Model 的 Schema 对象为 userSchema。
如何实现业务逻辑
Model 是实现业务逻辑的核心部分,开发者可以在 Model 中定义各种业务逻辑,例如增删改查、数据验证、钩子函数等。下面我们通过一个示例来演示如何在 Model 中实现数据验证的功能:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const { Schema } = mongoose; const userSchema = new Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, age: { type: Number, default: 0 }, createdAt: { type: Date, default: Date.now }, }); // 定义数据验证逻辑 userSchema.pre('save', async function validateUser(next) { const user = this; const pattern = /\w+@\w+\.\w+/; // 定义邮箱验证规则 if (!pattern.test(user.email)) { // 如果邮箱不合法,则抛出异常 throw new Error('Invalid email address'); } next(); }); const UserModel = mongoose.model('User', userSchema);
在上面的代码中,我们使用 pre 钩子函数来定义数据验证逻辑,当保存数据之前,会先执行该钩子函数中的 validateUser 方法进行数据验证。
示例代码
下面是完整的示例代码,可以参考进行学习:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const { Schema } = mongoose; const userSchema = new Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, age: { type: Number, default: 0 }, createdAt: { type: Date, default: Date.now }, }); userSchema.pre('save', async function validateUser(next) { const user = this; const pattern = /\w+@\w+\.\w+/; if (!pattern.test(user.email)) { throw new Error('Invalid email address'); } next(); }); const UserModel = mongoose.model('User', userSchema); (async function() { try { await mongoose.connect('mongodb://localhost/myapp', { useNewUrlParser: true, useUnifiedTopology: true, }); console.log('Connected to database'); // 插入一条数据 const user = new UserModel({ name: 'Tom', email: 'tom@example.com', age: 18 }); await user.save(); console.log('User created'); // 查询所有用户 const users = await UserModel.find(); console.log(users); } catch (error) { console.error('Error:', error.message); } finally { await mongoose.disconnect(); console.log('Disconnected from database'); } })();
总结
本文针对 Mongoose 中的 Schema 和 Model 进行了详细解析,并且给出了实现业务逻辑的示例。通过本文的学习,读者可以更好的掌握 Mongoose 的使用,并且将其应用到实际的开发中。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652bfec67d4982a6ebdd95bf