Mongoose 是一款开源的 Node.js MongoDB ODM(Object-Document Mapping),它是以一种优雅的方式将 Node.js 和 MongoDB 结合在一起。在使用 Mongoose 时,我们需要定义每个数据模型的结构,这个结构在 Mongoose 中被称作 Schema。一个 Mongoose Schema 提供了我们在创建和查询 MongoDB 文档时所需的一些额外的功能。
在 Mongoose 中,不同数据值可以采用不同的 Schema 类型进行定义,因此本文将从 Schema 类型的角度,为大家详细介绍 Mongoose 中常用的 schema 类型,以及如何使用这些类型定义数据模型。
类型列表
- String:字符串类型
- Number:数字类型
- Date:日期类型
- Buffer:二进制类型
- Boolean:布尔类型
- Mixed:混合类型,接受任何类型的数据
- ObjectId:此类型是用来定义 MongoDB 文档 _id 属性的,通常用于关联文档
- Array:数组类型
String
String 类型对应 JavaScript 的 String 类型。在 Mongoose 中,String 的长度默认为 255 个字符,如果需要可在定义时指定最大长度,例如:
const schema = new mongoose.Schema({ name: { type: String, maxlength: 50 // 最大长度为 50 个字符 }, content: String // 字符串类型,默认为 255 个字符 });
Number
Number 类型对应 JavaScript 的 Number 类型。在 Mongoose 中,值支持整型和浮点型,可以通过 min
和 max
来限制数值范围:
const schema = new mongoose.Schema({ age: { type: Number, min: [18, '年龄太小了'], max: [60, '年龄太大了'] } });
Date
Date 类型对应 JavaScript 的 Date 类型。在 Mongoose 中,Date 可以被指定为时间戳或 ISODate 字符串,例如:
const schema = new mongoose.Schema({ date: { type: Date, default: Date.now // 默认值为当前时间 } });
Buffer
Buffer 类型对应于 Node.js 中 buffer 类型,在 Mongoose 中通常用于存储二进制数据。例如:
const schema = new mongoose.Schema({ avatar: Buffer // 存储头像图片的二进制数据 });
Boolean
Boolean 类型对应 JavaScript 的 Boolean 类型。在 Mongoose 中,Boolean 的默认值是 false:
const schema = new mongoose.Schema({ done: { type: Boolean, default: false } });
Mixed
Mixed 类型接收任何类型的数据,可以用于存储复杂的非结构化数据,例如:
const schema = new mongoose.Schema({ data: Mixed // 存储复杂的数据结构 });
ObjectId
ObjectId 类型是用来定义 MongoDB 文档 _id 属性的,通常用于关联文档。例如:
const schema = new mongoose.Schema({ author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' // 关联到 User 模型 } });
Array
Array 类型可用于存储数组类型的数据,可以用来定义列表、一对多关系等。例如:
-- -------------------- ---- ------- ----- ------ - --- ----------------- ----- - ----- --------- -- ---------- --------- ----- --------- - ---------- -------- --- - ------ - -- -------- - -- -- -------- ----------- - - ---
总结
本文介绍了 Mongoose 中常用的 schema 类型以及每个类型的定义和使用方式,这些类型的使用可以让我们在定义数据模型时更加规范和严谨,同时也为我们进行 CRUD 操作提供了更多的开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645621e2968c7c53b09648e8