📅  最后修改于: 2023-12-03 15:39:07.585000             🧑  作者: Mango
Mongoose 是一款优秀的 MongoDB 驱动程序,它提供了强大的数据建模能力,并且非常易于学习和使用。在使用 Mongoose 进行 CRUD 操作之前,我们必须先定义数据模型,这就需要用到 Mongoose 的 Schema。
Schema 可以看做是一个基于数据结构的表结构,它描述了一个 Collection 中 Document 的属性和类型,以及可选的验证规则、默认值和虚拟属性等。我们可以使用 Mongoose 定义一个 Schema,然后根据这个 Schema 创建一个 Model,并且对这个 Model 进行 CURD 操作。
下面是一个简单的示例,我们定义了一个名为 User
的 Schema,它包含了一个 name
字段和一个 age
字段:
const mongoose = require('mongoose');
const { Schema } = mongoose;
const userSchema = new Schema({
name: {
type: String,
required: true
},
age: Number
});
const User = mongoose.model('User', userSchema);
module.exports = User;
首先,我们需要引入 Mongoose 并且获取 Schema
对象。然后我们通过 new
操作符创建了一个新的 Schema 对象,这个 Schema 中包含了我们需要的字段和验证规则。其中,name
字段类型为 String
,并且是必填的,而 age
字段类型为 Number
,是可选的。
最后,我们使用 mongoose.model
方法创建了一个名为 User
的 Model,并将其导出。
Mongoose 支持的字段类型有很多,下面是一些常见的类型:
String
Number
Date
Boolean
Array
ObjectId
Decimal128
Buffer
除此之外,Mongoose 还支持自定义的 Schema 类型,我们可以通过 mongoose.Schema.Types
来定义自己的类型。例如,我们可以定义一个包含经度和纬度的 GeoSchema
类型:
const geoSchema = new Schema({
type: {
type: String,
default: 'Point'
},
coordinates: {
type: [Number],
required: true
}
});
const storeSchema = new Schema({
name: {
type: String,
required: true
},
location: geoSchema
});
const Store = mongoose.model('Store', storeSchema);
module.exports = Store;
在定义 Schema 的字段时,我们可以为每个字段设置验证规则。Mongoose 提供了很多内置的验证器,也支持自定义的验证器。下面是一些常见的验证规则:
required
:必填项min
/ max
:数字类型的最小值 / 最大值minlength
/ maxlength
:字符串类型的最小长度 / 最大长度enum
:枚举类型,值必须在指定的枚举列表中match
:正则表达式匹配validate
:自定义验证器例如,我们可以为 User
的 name
字段设置验证规则:
const userSchema = new Schema({
name: {
type: String,
required: [true, 'Name is required'],
minlength: [2, 'Name must be at least 2 characters'],
maxlength: [50, 'Name must be at most 50 characters']
},
age: Number
});
我们可以为 Schema 中的字段设置默认值,当创建新的 Document 时,如果该字段未提供值,则会自动使用默认值。例如:
const userSchema = new Schema({
name: {
type: String,
required: true
},
age: {
type: Number,
default: 18
}
});
在创建新的 User
时,如果未提供 age
,则会默认使用 18
。
除了 Schema 中的真实属性,我们还可以定义虚拟属性,虚拟属性可以根据真实属性计算得出,但它不会保存到数据库中。例如,我们可以为 User
添加一个虚拟属性 fullName
,它根据 firstName
和 lastName
计算得出:
const userSchema = new Schema({
firstName: {
type: String,
required: true
},
lastName: {
type: String,
required: true
}
});
userSchema.virtual('fullName').get(function() {
return this.firstName + ' ' + this.lastName;
});
const User = mongoose.model('User', userSchema);
module.exports = User;
在查询 User
时,我们可以获取到该虚拟属性:
const user = await User.findOne({ _id: '12345' });
console.log(user.fullName);
通过本文,我们了解到了 Mongoose 中 Schema 的定义方法,以及常用的字段类型、验证规则、默认值和虚拟属性。在实际开发中,我们可以根据实际需求来定义自己的 Schema 和 Model,并通过 Mongoose 来进行数据的 CRUD 操作。