在 Nodejs 中,使用 mongoose 连接 MongoDB 数据库是非常方便的。而 mongoose 中的 Schema 是非常重要的一部分,它定义了数据的结构和类型,对数据的操作也是基于 Schema 来进行的。本文将详细介绍 mongoose 中的 Schema,包括定义 Schema、Schema 中的字段类型、虚拟属性、中间件等内容。
定义 Schema
在 mongoose 中定义 Schema 非常简单,只需要使用 mongoose.Schema
构造函数即可。例如,定义一个名为 User
的 Schema:
const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, });
上述代码创建了一个名为 User
的 Schema,包含了 name
、age
和 email
三个字段。其中,name
和 email
是字符串类型,age
是数字类型。这里需要注意的是,mongoose 中的 Schema 可以包含嵌套的子文档,例如:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, address: { city: String, street: String, zipcode: String, }, });
上述代码中,address
字段是一个嵌套的子文档,包含了 city
、street
和 zipcode
三个子字段。
Schema 中的字段类型
mongoose 中的 Schema 支持多种字段类型,包括:
- String:字符串类型
- Number:数字类型
- Date:日期类型
- Boolean:布尔类型
- Buffer:二进制类型
- ObjectId:MongoDB 的 ObjectId 类型
- Mixed:混合类型
- Array:数组类型
在定义字段时,可以指定字段的类型,例如:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, avatar: Buffer, created_at: Date, is_admin: Boolean, friends: [String], });
上述代码中,avatar
字段是二进制类型,created_at
字段是日期类型,is_admin
字段是布尔类型,friends
字段是字符串数组类型。
虚拟属性
虚拟属性是指在 Schema 中定义的,但是不会保存到数据库中的属性。虚拟属性通常用于返回计算得出的值或者格式化后的值。在 mongoose 中,可以使用 get
和 set
方法定义虚拟属性,例如:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, }); userSchema.virtual('avatar_url').get(function() { return `https://example.com/avatar/${this.name}.jpg`; });
上述代码中,定义了一个名为 avatar_url
的虚拟属性,它的值是根据 name
字段计算得出的头像 URL。在使用时,可以直接访问该属性:
const user = new User({ name: '张三', age: 20, email: 'zhangsan@example.com', }); console.log(user.avatar_url); // https://example.com/avatar/张三.jpg
中间件
在 mongoose 中,中间件是指在执行某个操作前或者后自动执行的函数。中间件可以用来实现一些预处理、后处理的逻辑,例如验证、自动填充等。mongoose 支持多种中间件,包括:
pre
:在执行某个操作前执行的中间件post
:在执行某个操作后执行的中间件validate
:在验证某个字段时执行的中间件init
:在初始化 Schema 时执行的中间件
下面是一个例子,定义了一个 pre
中间件,用来在保存用户信息前自动填充 created_at
字段:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, created_at: Date, }); userSchema.pre('save', function(next) { if (!this.created_at) { this.created_at = new Date(); } next(); });
上述代码中,使用 pre
方法定义了一个在保存数据前执行的中间件,该中间件会自动填充 created_at
字段。在执行保存操作时,中间件会自动执行,完成填充操作。
总结
本文介绍了 mongoose 中的 Schema,包括定义 Schema、Schema 中的字段类型、虚拟属性、中间件等内容。使用 mongoose 中的 Schema 可以很方便地定义数据结构和类型,并且可以实现一些预处理、后处理的逻辑,非常实用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6559ac6ed2f5e1655d416041