在 Mongoose 中,Virtuals 是一种虚拟属性,它们不会存储在数据库中,但可以在模型中定义和使用。Virtuals 可以用于计算属性、格式化数据、组合数据等。
本文将深入探讨 Mongoose 中的 Virtuals,包括如何定义、如何使用、如何扩展 Virtuals 的功能等。
定义 Virtuals
在 Mongoose 中,Virtuals 可以通过在 Schema 中定义 getter 和 setter 方法来创建。例如,我们可以在一个 User 模型中定义一个 Virtuals 属性 fullName,该属性由 firstName 和 lastName 组成:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ---------- ------- --------- ------ --- -- -- -------- ------- --------------------------------------------- - ------ -------------- - - - - -------------- ------------------------- - ----- ----- - ---------------- --- -------------- - --------- ------------- - --------- --- ----- ---- - ---------------------- ------------
上面的代码中,我们定义了一个 fullName Virtual,它是由 firstName 和 lastName 两个属性组合而成的。getter 方法将返回这个组合后的值,setter 方法将根据传入的值分离出 firstName 和 lastName 并赋值给相应的属性。
使用 Virtuals
Virtuals 可以像普通属性一样使用,但需要注意的是,它们不会被存储在数据库中。例如,我们可以创建一个 User 对象并设置 firstName 和 lastName 属性,然后使用 fullName Virtual 来获取完整的名字:
const user = new User({ firstName: 'John', lastName: 'Doe' }); console.log(user.fullName); // 输出:'John Doe'
在上面的代码中,我们创建了一个 User 对象,并设置了 firstName 和 lastName 属性。然后我们使用 fullName Virtual 来获取完整的名字,这个 Virtual 会自动计算并返回 firstName 和 lastName 的组合值。
扩展 Virtuals 的功能
除了基本的计算属性之外,Virtuals 还可以用于扩展模型的功能。例如,我们可以在一个 User 模型中定义一个 Virtuals 属性 friends,该属性会返回和当前用户有共同好友的其他用户:
userSchema.virtual('friends', { ref: 'User', localField: '_id', foreignField: 'friends' });
上面的代码中,我们定义了一个 friends Virtual,它会返回和当前用户有共同好友的其他用户。为了实现这个功能,我们需要设置 ref、localField 和 foreignField 三个参数:
- ref:关联的模型名称。
- localField:本地模型的字段名称,用于关联。
- foreignField:关联模型的字段名称,用于关联。
在上面的代码中,我们将 friends Virtual 关联到了 User 模型的 _id 字段,并将其作为 foreignField 和 friends 模型的 friends 字段进行关联。这样,friends Virtual 就可以返回和当前用户有共同好友的其他用户。
总结
Virtuals 是 Mongoose 中的一种虚拟属性,它们不会存储在数据库中,但可以在模型中定义和使用。Virtuals 可以用于计算属性、格式化数据、组合数据等,还可以扩展模型的功能。在使用 Virtuals 时,需要注意 Virtuals 不会被存储在数据库中,但可以像普通属性一样使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6603c658d10417a222040c6e