在 Node.js 的 Web 开发中,Mongoose 是一个非常流行的 MongoDB 驱动程序,它提供了一种简单而强大的方式来操作 MongoDB 数据库。在 Mongoose 中,Schema 是一个非常重要的概念,它用于定义 MongoDB 中的文档结构和属性,以及对这些属性进行验证和转换。本文将介绍 Mongoose 中 Schema 的设计与创建,帮助读者更好地理解和使用 Mongoose。
Schema 的基本结构
在 Mongoose 中,Schema 是由一个或多个字段组成的对象,每个字段都有一个名称和一个类型。以下是一个简单的示例:
const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, password: String });
在上面的示例中,我们定义了一个名为 userSchema 的 Schema,它包含了四个字段:name、age、email 和 password。其中,name 和 email 的类型为 String,age 的类型为 Number,password 的类型为 String。
Schema 的属性选项
在定义 Schema 字段时,我们还可以使用一些属性选项来对字段进行配置。以下是一些常用的属性选项:
type
:字段的数据类型,可以是 String、Number、Date、Boolean、Object、Array、Buffer、Map、Schema 等。required
:字段是否必填。default
:字段的默认值。unique
:字段是否唯一。validate
:字段的验证函数,用于验证字段的值是否符合要求。get
:字段的 getter 函数,用于在获取字段值时对其进行转换。set
:字段的 setter 函数,用于在设置字段值时对其进行转换。
以下是一个使用属性选项的示例:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: { type: String, required: true }, age: { type: Number, default: 18 }, email: { type: String, required: true, unique: true, validate: { validator: function(v) { return /\S+@\S+\.\S+/.test(v); }, message: props => `${props.value} is not a valid email address!` } }, password: { type: String, required: true, get: v => v.toUpperCase(), set: v => v.toLowerCase() } });
在上面的示例中,我们对每个字段都使用了不同的属性选项,例如 name 字段必填、age 字段默认为 18、email 字段必填且唯一、password 字段使用了 getter 和 setter 函数。
Schema 的扩展
在 Mongoose 中,Schema 还可以通过扩展来实现更复杂的功能。以下是一些常用的扩展:
timestamps
:自动添加 createdAt 和 updatedAt 字段,用于记录文档的创建时间和更新时间。toJSON
和toObject
:用于控制文档的序列化方式,可以自定义文档序列化后的格式。
以下是一个使用扩展的示例:
// javascriptcn.com 代码示例 const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, password: String }, { timestamps: true, toJSON: { virtuals: true, transform: function(doc, ret) { delete ret._id; delete ret.__v; ret.id = doc.id; } }, toObject: { virtuals: true, transform: function(doc, ret) { delete ret._id; delete ret.__v; ret.id = doc.id; } } });
在上面的示例中,我们通过传递第二个参数来使用了 timestamps、toJSON 和 toObject 扩展。其中,timestamps 扩展用于自动添加 createdAt 和 updatedAt 字段,toJSON 和 toObject 扩展用于控制文档的序列化方式,包括是否包含虚拟字段、如何转换文档格式等。
Schema 的创建和使用
在定义好 Schema 后,我们可以使用它来创建模型并进行 CRUD 操作。以下是一个简单的示例:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, age: Number, email: String, password: String }); const User = mongoose.model('User', userSchema); mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true }); const user = new User({ name: 'John', age: 20, email: 'john@example.com', password: '123456' }); user.save(function(err) { if (err) { console.error(err); } else { console.log('User saved successfully!'); } });
在上面的示例中,我们首先定义了一个名为 userSchema 的 Schema,然后使用它来创建了一个名为 User 的模型。接着,我们连接了 MongoDB 数据库,并创建了一个名为 user 的文档,并将其保存到数据库中。
总结
在本文中,我们介绍了 Mongoose 中 Schema 的设计与创建,包括基本结构、属性选项、扩展以及创建和使用。希望读者通过本文的学习,能够更好地理解和使用 Mongoose 中的 Schema,从而提高 Node.js Web 开发的效率和质量。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6573fd03d2f5e1655dd359d3