前言
Mongoose 是一种在 Node.js 中使用的面向对象的 MongoDB 模型工具。它使得 MongoDB 的操作变得更加简单、易用且干净。在使用 Mongoose 进行开发时,Schema 虚拟属性是一个非常有用的功能,可以用于将需要展示的信息进行处理和拼接。
什么是 Schema 虚拟属性
Schema 虚拟属性可以根据已有的 Schema 字段来衍生出新的字段,它们不会保存在 MongoDB 数据库中,只会在使用时进行拼接得到。虚拟属性的计算是非常简单的,它们只会在被调用的时候得到计算,也就是说,它们不需要进行存储,因为它们可以通过其他字段动态计算得到。
虚拟属性最常用的场景是,在 Mongoose 查询返回时,可以通过 Schema 虚拟属性处理和拼接需要展示的信息。例如:
const schema = new mongoose.Schema({ firstName: String, lastName: String }) schema.virtual('fullName').get(function () { return `${this.firstName} ${this.lastName}` })
在这个例子中,为人的 Schema 设置了 firstName 和 lastName 两个字段,然后计算得到了 fullName。fullName 并没有被存储于数据库中,它只是根据其他两个字段计算得到的。
Schema 虚拟属性的指导意义
帮助模型展示层级关系
在模型设计中,可能存在数据结构比较复杂,需要展示子模型的层级关系的情况。我们可以通过虚拟字段来实现对这些子模型层级关系的处理和拼接。
例如:
const schema = new mongoose.Schema({ name: String, children: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Child' }] }) schema.virtual('childrenCount').get(function () { return this.children ? this.children.length : 0 })
在这个例子中,我们通过定义 childrenCount 虚拟字段来获取当前的父节点下的子节点个数。这个字段不会被存储到数据库中,但是我们可以方便地获取子节点数量,例如:
const parent = await Parent.findOne({ _id: '1234567890' }).populate('children') console.log(parent.childrenCount) // 获取到当前节点下的子节点个数
对属性进行格式化
在从数据库中获取记录以及在将记录返回给客户端时,可能需要对记录中的某些属性进行格式化(比如日期格式、字符串格式)。这时,我们可以在 Schema 中定义虚拟属性进行格式化操作。
例如:
const schema = new mongoose.Schema({ name: String, date: Date }) schema.virtual('formattedDate').get(function () { return this.date ? moment(this.date).format('YYYY-MM-DD HH:mm:ss') : '' })
这个例子中,我们定义了一个虚拟属性 formattedDate,这个属性通过 moment 库将日期格式化为了指定格式的字符串并返回。在开发中,我们可以通过 formattedDate 来方便地获取格式化后的日期字符串。
帮助进行数据处理和计算
在开发中,我们可能需要根据其他字段进行数据处理或者计算。当需要使用这些数据的时候,我们可以将处理后的结果作为虚拟字段返回。
例如:
const schema = new mongoose.Schema({ name: String, age: Number, address: String }) schema.virtual('detail').get(function () { return { name: this.name, age: this.age, address: this.address, salary: this.age * 10000 // 假设薪水计算公式为 年龄 * 10000 } })
在这个例子中,我们通过定义 detail 虚拟字段来计算员工薪水。薪水的计算公式为 age * 10000。在开发中,我们可以通过虚拟字段来获取员工的详细信息(包括薪水),而不必每次都需要计算。
虚拟属性的优缺点
优点
- 实用性强,避免了数据库数据冗余,不需要存储到数据库中。
- 方便进行格式化、数据处理和计算。
- 对于一些数据只需要在展示时使用,不需要进行存储。
缺点
- 无法在查询时进行排序。
- 无法用于范围查询。
- 不支持在 Schema.static 和 Schema.method 中使用。
总结
Schema 虚拟属性是 Mongoose 中非常有用的一个功能,它可以帮助我们更加方便地进行数据库数据处理和计算。在使用的时候,我们需要根据不同的场景进行定义和使用,并注意虚拟属性的优缺点以及适用范围。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65910118eb4cecbf2d63b2e8