当我们在使用 Mongoose 进行 MongoDB 数据库操作的时候,常常需要定义 Schema,Schema 是一个文档结构的定义,包含了字段名称、类型、属性等信息,这对于需要进行有效规划的 Web 应用程序来说至关重要。
在 Mongoose 中,有两种非常重要的 Schema 的特性,分别是默认值和校验器。本文将介绍如何使用默认值和校验器在 Mongoose 中定义和使用 Schema。本文假设读者已经熟悉 MongoDB、Node.js 和 Mongoose。 如果您已经熟悉了这些概念,那么您可以自行跳过一些基本部分,直接进入下面的示例代码和校验器实例分析。
基础 Schema 的定义
以下是一个示例用于演示 Mongoose Schema 的基础定义。在这个定义中,我们定义了一个电影的 Schema:
// javascriptcn.com 代码示例 const MovieSchema = new mongoose.Schema({ title: { type: String, required: true }, rating: Number, release_date: Date, director: String, actors: [String] });
上述代码定义了一个电影的文档,其中有五个字段,分别是:
title
:电影名称,必须,类型为字符串。rating
:评级,非必须,类型为数字。release_date
:发布日期,非必须,类型为日期。director
:导演,非必须,类型为字符串。actors
:演员,非必须,类型为字符串数组。
在基础的 Schema 定义之后,我们可以使用这个 Schema 来创建新的电影数据。
使用默认值
在定义 Schema 的过程中,我们可以定义默认值,在这个 Schema 中还应该为默认值提供一些规定,以确保数据的完整性。
以下是一个示例用于演示默认值的电影 Schema:
// javascriptcn.com 代码示例 var MovieSchema = new mongoose.Schema({ title: { type: String, required: true }, release_date: { type: Date, default: Date.now }, rating: { type: Number, default: 3, min: 0, max: 5 }, director: String, actors: [String], created_at: { type: Date, default: Date.now } });
上述代码中,release_date
字段和 created_at
字段都设置了默认值,如果这两个字段没有在插入数据库时被定义,Mongoose 将会使用默认值。
rating
字段也设置了默认值,并通过 min
和 max
两个属性标定了可接受值的范围。如果不进行显示赋值, rating
列表的默认值是 3。
手动修改默认值
在 Schema 定义后,我们可以使用 schema.set()
方法来修改默认值,示例如下:
// javascriptcn.com 代码示例 var MovieSchema = new mongoose.Schema({ title: String, created_at: { type: Date, default: Date.now } }); MovieSchema.set('toObject', { getters: true }); var Movie = mongoose.model('Movie', MovieSchema); // 创建并保存电影实例, createdAt 属性的默认值为 Date.now() var movie = new Movie({ title: '新电影' }); movie.save(); // 将默认选项修改为 {getters: false} Movie.schema.set('toObject', { getters: false }); // 检索电影实例, createdAt 属性的默认值现在是 undefined Movie.findOne({ title: '新电影' }, function(err, movie) { console.log(movie.createdAt); // undefined });
各类校验器使用实例
必填字段
首先,我们可以使用 required
校验器定义一个字段,示例如下:
// javascriptcn.com 代码示例 var MovieSchema = new mongoose.Schema({ title: { type: String, required: true } }); var Movie = mongoose.model('Movie', MovieSchema); // 创建空数据并保存 var movie = new Movie({ }); movie.save(function(err) { console.log(err); // 返回一个验证错误 });
Mongoose 会在保存数据之前进行验证,以确保必填字段已经被定义,如果验证失败,将会抛出错误。
自定义校验器
Mongoose 允许你使用 validate
校验器来定义一些自定的函数逻辑校验器。
下面是一个通过 validate
校验器定义的自定逻辑,该自定义逻辑要求电影评分必须在 0 到 100 之间:
// javascriptcn.com 代码示例 // 自定义逻辑校验器,评级应该是 0 到 100 之间的数字 var validateRating = function(rating) { if (rating !== undefined && (rating < 0 || rating > 100)) { return false; } return true; }; var MovieSchema = new mongoose.Schema({ title: { type: String, required: true }, rating: { type: Number, validate: validateRating } }); var Movie = mongoose.model('Movie', MovieSchema); // 创建高于 100 的电影评级数据,并尝试保存 var movie = new Movie({ title: 'awesomeness', rating: 101 }); movie.save(function(err) { console.log(err); // 返回一个验证错误 });
嵌套 Schema 校验器
在某些情况下,我们需要在一个嵌套的 Schema 中定义特定字段的验证规则。
这里我们使用 Subdocument
类型来定义一个嵌套的 Schema,然后添加一个校验器,确保某个字段为定义必填值。
// javascriptcn.com 代码示例 var ActorSchema = new mongoose.Schema({ name: { type: String, required: true } }); var MovieSchema = new mongoose.Schema({ title: { type: String, required: true }, actors: [ActorSchema] }); var Movie = mongoose.model('Movie', MovieSchema); // 创建一个缺少演员名称的电影实例,并尝试保存 var movie = new Movie({ title: '测试电影', actors: [ { name: 'Brad Pitt' }, { } ] }); movie.save(function(err) { console.log(err); //返回验证错误 });
在上述代码中,我们创建了一个 Movie Schema 和一个 Actor Schema,然后将 Actor Schema 处理为 Subdocument
。这样被附加到主容器中的字段就会被添加一个根据实例来有效验证的嵌套 Schema 校验器。
总结
在本文中,我们了解了如何在 Mongoose 中使用默认值和校验器来定义 Schema。我们首先讲述了基础的 Schema 定义,然后具体讲了如何使用默认值,包括手动修改默认值。接着我们引入了各类校验器通过使用示例来掌握其用法,这些校验器包括必填字段、自定义校验器和嵌套的 Schema 校验器。虽然 Schema 定义只是 MongoDB 数据集中的一部分,但对于有效的 MongoDB 操作是至关重要的。祝愿读者在开发 MongoDB + Node.js Web 应用程序中使用 Schema 打造出更为出色的应用!
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654dbc9a7d4982a6eb72445b