Mongoose 是一个 Node.js 的 ORM 库,用于在 Node.js 中操作 MongoDB 数据库。Mongoose 提供了一种简单而强大的方式来定义数据模型和数据验证规则,方便开发人员进行数据的操作和管理。其中,Schema 是 Mongoose 中的重要概念,本文将详细介绍 Mongoose Schema 的基础知识及其实例应用。
什么是 Mongoose Schema
Mongoose Schema 是指 MongoDB 数据库中的数据结构定义,它用于定义集合中的文档的属性和类型。Schema 可以包含以下数据类型:
- String:字符串类型
- Number:数字类型
- Date:日期类型
- Buffer:二进制数据类型
- Boolean:布尔类型
- Mixed:混合类型
- ObjectId:对象 ID 类型
- Array:数组类型
除了以上的数据类型,Mongoose 还支持自定义数据类型。
Mongoose Schema 的基本使用
在使用 Mongoose Schema 时,首先需要在代码中引入 Mongoose 模块,然后定义一个 Schema 对象。下面是一个简单的示例:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const bookSchema = new Schema({ title: String, author: String, publishDate: Date, price: Number, isPublished: Boolean });
在上面的示例中,我们定义了一个名为 bookSchema
的 Schema,其中包含了五个属性,分别为 title
、author
、publishDate
、price
和 isPublished
。这些属性的类型分别为 String、String、Date、Number 和 Boolean。
在定义完 Schema 后,我们可以使用它来创建一个 Mongoose 模型,如下所示:
const Book = mongoose.model('Book', bookSchema);
在上面的代码中,我们使用 mongoose.model()
方法创建了一个名为 Book
的模型,该模型使用了 bookSchema
作为其数据结构定义。
Mongoose Schema 的详细属性设置
除了上面提到的数据类型外,Mongoose Schema 还有许多其他属性设置。下面我们将逐一介绍这些属性。
required
required
属性用于指定某个属性是否必须存在。如果该属性未被定义或者其值为 null,则会触发验证失败。示例如下:
const bookSchema = new Schema({ title: { type: String, required: true }, author: { type: String, required: true }, publishDate: { type: Date, required: true }, price: { type: Number, required: true }, isPublished: { type: Boolean, required: true } });
在上面的示例中,我们使用了 required
属性来指定了每个属性都是必须存在的。
default
default
属性用于指定某个属性的默认值。如果该属性未被定义或者其值为 null,则会使用默认值。示例如下:
const bookSchema = new Schema({ title: { type: String, required: true }, author: { type: String, required: true }, publishDate: { type: Date, required: true }, price: { type: Number, required: true, default: 0 }, isPublished: { type: Boolean, required: true, default: false } });
在上面的示例中,我们使用了 default
属性来指定了 price
的默认值为 0,isPublished
的默认值为 false。
unique
unique
属性用于指定某个属性是否唯一。如果该属性被定义为唯一,则会触发验证失败,如果该属性的值与数据库中已存在的值相同,则会触发唯一性验证失败。示例如下:
const bookSchema = new Schema({ title: { type: String, required: true, unique: true }, author: { type: String, required: true }, publishDate: { type: Date, required: true }, price: { type: Number, required: true, default: 0 }, isPublished: { type: Boolean, required: true, default: false } });
在上面的示例中,我们使用了 unique
属性来指定了 title
是唯一的。
enum
enum
属性用于指定某个属性的值必须在指定的范围内。示例如下:
const bookSchema = new Schema({ title: { type: String, required: true, unique: true }, author: { type: String, required: true }, publishDate: { type: Date, required: true }, price: { type: Number, required: true, default: 0 }, isPublished: { type: Boolean, required: true, default: false }, category: { type: String, enum: ['fiction', 'non-fiction'], required: true } });
在上面的示例中,我们使用了 enum
属性来指定了 category
的值必须为 fiction
或 non-fiction
。
validate
validate
属性用于指定某个属性的值必须满足指定的验证函数。验证函数接收一个参数,即要验证的属性值,返回一个布尔值,表示是否验证通过。示例如下:
// javascriptcn.com 代码示例 const bookSchema = new Schema({ title: { type: String, required: true, unique: true }, author: { type: String, required: true }, publishDate: { type: Date, required: true }, price: { type: Number, required: true, default: 0 }, isPublished: { type: Boolean, required: true, default: false }, category: { type: String, enum: ['fiction', 'non-fiction'], required: true }, pages: { type: Number, validate: { validator: function(v) { return v > 0; }, message: 'Pages must be greater than 0' } } });
在上面的示例中,我们使用了 validate
属性来指定了一个验证函数,该函数验证了 pages
的值必须大于 0。
Mongoose Schema 的实例应用
下面我们将通过一个完整的示例来演示 Mongoose Schema 的实际应用。假设我们要开发一个图书管理系统,其中需要对图书进行增、删、改、查等操作。下面是一个简单的示例:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const bookSchema = new Schema({ title: { type: String, required: true }, author: { type: String, required: true }, publishDate: { type: Date, required: true }, price: { type: Number, required: true, default: 0 }, isPublished: { type: Boolean, required: true, default: false }, category: { type: String, enum: ['fiction', 'non-fiction'], required: true }, pages: { type: Number, validate: { validator: function(v) { return v > 0; }, message: 'Pages must be greater than 0' } } }); const Book = mongoose.model('Book', bookSchema); mongoose.connect('mongodb://localhost/books', { useNewUrlParser: true }) .then(() => console.log('Connected to MongoDB...')) .catch(err => console.error('Could not connect to MongoDB...', err)); async function createBook(book) { const result = await new Book(book).save(); console.log(result); } async function getBooks() { const books = await Book.find().sort('title'); console.log(books); } async function updateBook(id) { const book = await Book.findByIdAndUpdate(id, { $set: { author: 'New Author', isPublished: false } }, { new: true }); console.log(book); } async function removeBook(id) { const result = await Book.deleteOne({ _id: id }); console.log(result); } createBook({ title: 'Book 1', author: 'Author 1', publishDate: new Date('2020-01-01'), price: 10, isPublished: true, category: 'fiction', pages: 100 }); getBooks(); updateBook('5fcf5d8d1c5c5e1e9c7d5f8a'); removeBook('5fcf5d8d1c5c5e1e9c7d5f8a');
在上面的示例中,我们首先定义了一个名为 bookSchema
的 Schema,其中包含了七个属性,分别为 title
、author
、publishDate
、price
、isPublished
、category
和 pages
。然后我们使用 mongoose.model()
方法创建了一个名为 Book
的模型,该模型使用了 bookSchema
作为其数据结构定义。
接着我们使用 mongoose.connect()
方法连接到 MongoDB 数据库,并定义了四个异步函数,分别用于创建图书、获取图书、更新图书和删除图书。在 createBook()
函数中,我们使用 new Book(book).save()
方法将图书保存到数据库中。在 getBooks()
函数中,我们使用 Book.find().sort('title')
方法获取所有图书,并按照 title
属性排序。在 updateBook()
函数中,我们使用 Book.findByIdAndUpdate()
方法根据 ID 更新图书的 author
和 isPublished
属性。在 removeBook()
函数中,我们使用 Book.deleteOne()
方法根据 ID 删除图书。
最后,我们调用了 createBook()
、getBooks()
、updateBook()
和 removeBook()
函数,分别执行了图书的创建、获取、更新和删除操作。
总结
本文详细介绍了 Mongoose Schema 的基础知识及其实例应用。Mongoose Schema 提供了一种简单而强大的方式来定义数据模型和数据验证规则,方便开发人员进行数据的操作和管理。掌握 Mongoose Schema 的基础知识对于开发 Node.js 应用程序是非常重要的。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/657f90b8d2f5e1655da6be43