在 Node.js 的 MongoDB 驱动程序中,Mongoose 是一个非常流行的对象文档映射 (Object Document Mapping, ODM) 库。它能让我们在 Node.js 中更方便地操作 MongoDB 数据库,同时也提供了一些强大的功能,比如数据验证、中间件等。在 Mongoose 中,Schema 是非常重要的一个概念,它定义了文档的结构和属性,也是对数据进行验证和存储的基础。本文将详细介绍 Mongoose 中的 Schema 类型及其应用场景。
Schema 类型
Mongoose 中的 Schema 类型有以下几种:
String
字符串类型,用于存储字符串,可以设置默认值、最大长度、最小长度等。
// www.javascriptcn.com code example
const schema = new mongoose.Schema({
name: {
type: String,
required: true,
minlength: 2,
maxlength: 20,
default: 'John Doe'
}
});Number
数字类型,用于存储数字,可以设置默认值、最大值、最小值等。
// www.javascriptcn.com code example
const schema = new mongoose.Schema({
age: {
type: Number,
required: true,
min: 18,
max: 100,
default: 18
}
});Date
日期类型,用于存储日期,可以设置默认值、最小日期、最大日期等。
// www.javascriptcn.com code example
const schema = new mongoose.Schema({
birth: {
type: Date,
required: true,
min: '1900-01-01',
max: '2021-12-31',
default: Date.now
}
});Boolean
布尔类型,用于存储 true/false 值,可以设置默认值。
const schema = new mongoose.Schema({
isVip: {
type: Boolean,
required: true,
default: false
}
});ObjectId
ObjectId 类型,用于存储 MongoDB 中的 ObjectId 值,可以设置默认值。
const schema = new mongoose.Schema({
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true
}
});Array
数组类型,用于存储数组,可以设置数组元素的类型、默认值等。
const schema = new mongoose.Schema({
tags: {
type: [String],
default: []
}
});Mixed
混合类型,用于存储任意类型的数据,不做数据验证。
const schema = new mongoose.Schema({
data: {
type: mongoose.Schema.Types.Mixed,
required: true
}
});Buffer
缓冲区类型,用于存储二进制数据,比如图片、文件等。
const schema = new mongoose.Schema({
avatar: {
type: Buffer,
required: true
}
});应用场景
Mongoose 中的 Schema 类型可以根据实际需求进行灵活选择和组合,以下是一些常见的应用场景:
数据验证
Schema 类型可以用于对数据进行验证,比如设置字符串的最大长度、数字的最小值等。在保存数据时,如果不符合验证规则,将会抛出错误。
// www.javascriptcn.com code example
const schema = new mongoose.Schema({
name: {
type: String,
required: true,
minlength: 2,
maxlength: 20
},
age: {
type: Number,
required: true,
min: 18,
max: 100
}
});数据转换
Schema 类型可以用于将存储的数据进行转换,比如将字符串转换为数字、将日期字符串转换为 Date 对象等。
// www.javascriptcn.com code example
const schema = new mongoose.Schema({
age: {
type: Number,
required: true,
get: v => Math.round(v),
set: v => Math.round(v)
},
birth: {
type: Date,
required: true,
get: v => new Date(v),
set: v => v.toISOString().substr(0, 10)
}
});数据默认值
Schema 类型可以用于设置数据的默认值,当保存数据时,如果没有设置相应的属性,将会使用默认值。
// www.javascriptcn.com code example
const schema = new mongoose.Schema({
name: {
type: String,
required: true,
default: 'John Doe'
},
age: {
type: Number,
required: true,
default: 18
}
});数据关联
Schema 类型可以用于定义数据之间的关系,比如将文章和作者进行关联。
// www.javascriptcn.com code example
const authorSchema = new mongoose.Schema({
name: String
});
const articleSchema = new mongoose.Schema({
title: String,
content: String,
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Author'
}
});示例代码
// www.javascriptcn.com code example
const mongoose = require('mongoose');
const authorSchema = new mongoose.Schema({
name: String
});
const articleSchema = new mongoose.Schema({
title: {
type: String,
required: true,
minlength: 2,
maxlength: 50
},
content: {
type: String,
required: true,
minlength: 10,
maxlength: 10000
},
author: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Author'
},
tags: {
type: [String],
default: []
},
createdAt: {
type: Date,
default: Date.now
}
});
const Author = mongoose.model('Author', authorSchema);
const Article = mongoose.model('Article', articleSchema);
(async () => {
await mongoose.connect('mongodb://localhost/test', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const author = new Author({ name: 'John Doe' });
await author.save();
const article = new Article({
title: 'Hello world',
content: 'This is my first article.',
author: author._id,
tags: ['hello', 'world']
});
await article.save();
const articles = await Article.find()
.populate('author', 'name')
.sort('-createdAt')
.exec();
console.log(articles);
await mongoose.disconnect();
})();上面的示例代码演示了如何定义一个包含作者和文章的数据模型,并将它们关联起来。在保存文章时,我们使用了默认值和数组类型。在查询文章时,我们使用了 populate() 方法将作者信息一并查询出来。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67da6005a941bf7134250e4e