在 Node.js 中,Mongoose 是一个非常流行的用于操作 MongoDB 数据库的 ORM 框架。在 Mongoose 中,Schema 是定义 MongoDB 数据库中数据结构的核心概念,它定义了集合中的文档的属性、类型、默认值等信息。本文将介绍 Mongoose 中的 Schema 建立规范及细节注意事项,帮助读者更好地使用 Mongoose 进行开发。
1. 定义 Schema
在 Mongoose 中,可以使用 Schema 构造函数来定义一个 Schema,如下所示:
const { Schema } = require('mongoose'); const userSchema = new Schema({ name: String, age: Number, email: String, });
上面的代码定义了一个名为 userSchema
的 Schema,它包含了三个属性:name
、age
和 email
。其中,name
和 email
属性的类型为 String,age
属性的类型为 Number。
2. Schema 类型
在 Mongoose 中,支持的 Schema 类型包括了以下几种:
- String:字符串类型。
- Number:数字类型。
- Date:日期类型。
- Buffer:二进制数据类型。
- Boolean:布尔类型。
- Mixed:混合类型,可以存储任意类型的数据。
- ObjectId:文档 ID 类型。
- Array:数组类型。
可以根据实际需要选择不同的类型。
3. Schema 属性
在定义 Schema 时,可以为每个属性指定一些属性,如下所示:
const userSchema = new Schema({ name: { type: String, required: true, trim: true, }, age: { type: Number, min: 0, max: 120, }, email: { type: String, required: true, unique: true, lowercase: true, }, });
上面的代码中,为每个属性指定了不同的属性。如 name
属性指定了 required
和 trim
属性,age
属性指定了 min
和 max
属性,email
属性指定了 required
、unique
和 lowercase
属性。
下面是常用的属性说明:
type
:指定属性的类型。required
:指定属性是否必须。default
:指定属性的默认值。min
:指定属性的最小值。max
:指定属性的最大值。enum
:指定属性的枚举值。match
:指定属性的正则表达式。
4. Schema 方法
在 Mongoose 中,Schema 还可以定义一些方法,如下所示:
const userSchema = new Schema({ name: String, age: Number, email: String, }); userSchema.methods.getFullName = function() { return `${this.firstName} ${this.lastName}`; };
上面的代码中,定义了一个名为 getFullName
的方法,用于获取用户的全名。
5. Schema 静态方法
除了实例方法之外,Schema 还可以定义静态方法,如下所示:
const userSchema = new Schema({ name: String, age: Number, email: String, }); userSchema.statics.findByName = function(name) { return this.find({ name }); };
上面的代码中,定义了一个名为 findByName
的静态方法,用于根据用户名查找用户。
6. Schema 中间件
在 Mongoose 中,Schema 还支持中间件,用于在执行某些操作之前或之后执行一些代码。如下所示:
const userSchema = new Schema({ name: String, age: Number, email: String, }); userSchema.pre('save', function(next) { this.updatedAt = new Date(); next(); });
上面的代码中,定义了一个名为 save
的中间件,用于在保存文档之前更新 updatedAt
属性。
7. 注意事项
在使用 Mongoose 进行开发时,需要注意以下几点:
- Schema 中的属性名称应该与数据库中的字段名称保持一致。
- 不要在 Schema 中定义与 MongoDB 内置方法同名的方法,否则可能会导致意想不到的结果。
- Schema 中的属性名称不要与 Mongoose 的内置方法或属性同名,否则可能会导致意想不到的结果。
- 在定义 Schema 时,应该尽可能地使用 Schema 类型,以便 Mongoose 可以正确地转换数据类型。
- 在定义 Schema 属性时,应该尽可能地指定属性类型和属性选项,以便 Mongoose 可以对数据进行正确的验证和转换。
8. 示例代码
下面是一个完整的示例代码,用于演示如何定义一个名为 User
的 Schema,并使用它创建一个名为 users
的集合:
const mongoose = require('mongoose'); const { Schema } = mongoose; // 连接 MongoDB 数据库 mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true, }); // 定义 User Schema const userSchema = new Schema({ name: { type: String, required: true, trim: true, }, age: { type: Number, min: 0, max: 120, }, email: { type: String, required: true, unique: true, lowercase: true, }, createdAt: { type: Date, default: Date.now, }, updatedAt: { type: Date, default: Date.now, }, }); // 定义 User 实例方法 userSchema.methods.getFullName = function() { return `${this.firstName} ${this.lastName}`; }; // 定义 User 静态方法 userSchema.statics.findByName = function(name) { return this.find({ name }); }; // 定义 User 中间件 userSchema.pre('save', function(next) { this.updatedAt = new Date(); next(); }); // 创建 User 模型 const User = mongoose.model('User', userSchema); // 创建并保存一个 User 文档 const user = new User({ name: 'John', age: 30, email: 'john@example.com', }); user.save((err, doc) => { if (err) { console.error(err); return; } console.log(doc); });
9. 总结
本文介绍了 Mongoose 中的 Schema 建立规范及细节注意事项,包括了如何定义 Schema、Schema 类型、Schema 属性、Schema 方法、Schema 静态方法、Schema 中间件等内容。希望读者能够通过本文的介绍,更好地使用 Mongoose 进行开发。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bd93ecadd4f0e0ff746f4e