介绍
Mongoose 是 MongoDB 的一种对象模型工具,它在使用 MongoDB 时提供了更加易用和便利的 API,同时支持丰富的中间件和插件。而虚拟属性是 Mongoose 中一个非常有用的功能,它可以让我们在模型中定义一些属性,这些属性不会被真正的存储到数据库中,但是我们可以在代码中使用它们,以及通过它们获取和设置其他实际存储在数据库中的属性。
使用场景
虚拟属性在很多情况下可以方便我们的开发,比如:
- 我们需要根据某些实际属性计算出一些值,并将这些值暴露给前端。
- 我们需要将多个实际属性合并到一个虚拟属性中,并将其作为一个单独的字段暴露给前端。
- 我们需要对某些实际属性进行过滤或者转换,并将转换后的结果暴露给前端,而不影响实际数据的存储。
使用方法
在 Mongoose 中定义一个虚拟属性非常简单,只需要在 Schema 中使用 virtual 方法即可。virtual 方法有两种方式,一种是通过 getter 和 setter 函数实现,另一种是通过虚拟属性的配置对象实现。下面我们来看一下具体的使用方法。
通过 getter 和 setter 函数实现
-- -------------------- ---- ------- ----- ------------ - --- ----------------- ---------- ------- --------- ------ --- -------------------------------- ------------- -- - ------ -------------- - - - - -------------- -- ------------- ------- - ----- ----- - ------------- --- -------------- - --------- ------------- - --------- ---展开代码
上面的代码中,我们首先定义了一个 person 的 Schema,其中包括了 firstName 和 lastName 两个实际属性。然后我们通过 virtual 方法定义了一个名为 fullName 的虚拟属性,它由 firstName 和 lastName 两个实际属性计算得出。我们通过 getter 函数获取 fullName 的值,通过 setter 函数设置 fullName 的值,并在 setter 函数中计算出 firstName 和 lastName 的值。
const person = new Person({firstName: 'John', lastName: 'Doe'}); console.log(person.fullName); // John Doe person.fullName = 'Mary Sue'; console.log(person.firstName); // Mary console.log(person.lastName); // Sue
在上面的代码中,我们通过 Person 构造函数创建了一个 person 对象,然后通过 fullName 获取了其全名。接下来我们通过 fullName 的 setter 设置了其全名,从而修改了 firstName 和 lastName 的值。
通过虚拟属性的配置对象实现
-- -------------------- ---- ------- ----- ------------ - --- ----------------- ---------- ------- --------- ------ --- --------------------------------- ------ -- ------------------ ------------------- ----------- -- - ----- ----- - ------------- --- -------------- - --------- ------------- - --------- ---展开代码
上面的代码使用了箭头函数来简化 getter 和 setter 函数的表达方式。我们在 virtual 方法中传入一个配置对象,该对象包含了 getter 和 setter 的函数。
const person = new Person({firstName: 'John', lastName: 'Doe'}); console.log(person.fullName); // John Doe person.fullName = 'Mary Sue'; console.log(person.firstName); // Mary console.log(person.lastName); // Sue
输出结果和前面的例子一样。
虚拟属性的常用场景
在上文中我们提到了一些虚拟属性的常用场景,下面我们分别介绍一下它们的实现方法。
计算值并暴露给前端
const orderSchema = new mongoose.Schema({ products: [String], totalPrice: Number }); orderSchema.virtual('totalPriceDollars'). get(() => `$${(this.totalPrice / 100).toFixed(2)}`)
在上面的代码中,我们通过虚拟属性计算出了订单的总价钱,并将其转换成美元格式,最后暴露给前端。
合并属性并暴露给前端
-- -------------------- ---- ------- ----- ------------ - --- ----------------- ----- - ------ ------- ----- ------ -- ------ ------ --- --------------------------------- ------ -- ------------------- -------------------- ----------- -- - ----- ----- - ------------- --- --------------- - --------- -------------- - --------- --- ----------------------------------- ------ -- -- --------- -------------- ------ ---------- ----展开代码
在上面的代码中,我们通过虚拟属性 personInfo 将 fullName 和 email 属性合并到一个对象中,并将其暴露给前端。
过滤和转换属性并暴露给前端
-- -------------------- ---- ------- ----- ------------ - --- ----------------- ---------- ------- --------- ------- ------ ------ --- ----------------------------------- ------ -- -- ---------- ----------------------------- --------- ---------------------------- ------ ---------- ---- ----- ------ - ------------------------ -------------- ----- ------ - --- -------- ---------- ------- --------- ------ ------ ---------------------- --- ------------------------------- -- ----------- ------- --------- ------ ------ -----------------------展开代码
在上面的例子中,我们将 firstName 和 lastName 属性转换成大写字母,并将转换后的值暴露给前端。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bd3279a231b2b7edf560cd