在使用 Mongoose 进行数据库操作的过程中,Virtuals 方法是一种十分常见且有用的功能。通过 Virtuals 方法,我们可以在获取和修改数据的过程中,将一些非数据库中存储的属性与模型绑定在一起,使得我们的代码更加简洁易读,且符合封装的原则。
Virtuals 的定义和使用
Virtuals 在 Mongoose 中的定义方式如下:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ----- - ------ ------- ----- ------ - --- --------------------------------------------- - ------ --------------- - - - - --------------- ---展开代码
其中,我们通过 virtual
方法来定义一个名为 fullName
的虚拟属性,在这里,我们可以使用 get
方法来指定获取虚拟属性所需要执行的函数。在该函数中,我们可以自行定义虚拟属性的取值方式,可以根据数据库中的数据来组合属性,也可以根据当前对象的状态来返回属性值。
在使用 Virtuals 的过程中,我们可以通过模型实例来获取虚拟属性:
const User = mongoose.model('User', userSchema); const currentUser = new User({ name: { first: 'John', last: 'Doe' } }); console.log(currentUser.fullName); // 'John Doe'
除此之外,我们还可以通过 toObject
或者 toJSON
方法将虚拟属性转化为普通属性:
const user = await User.findOne({ name: { first: 'John', last: 'Doe' } }); const userObj = user.toObject(); console.log(user.fullName); // 'John Doe' console.log(userObj.fullName); // 'John Doe'
Virtuals 的指导意义
通过使用 Mongoose 中的 Virtuals 方法,我们可以将多个属性合并为一个属性,这样不仅可以更好地符合实际模型的设计,还可以消除很多不必要的繁琐代码,同时,也能提升代码的可读性和易用性。比如,在上面的示例中,我们将 name
对象中的 first
和 last
属性组合成了一个 fullName
属性,这样一来,在获取和设置用户的全名时,我们只需要操作一个属性即可,而不需要分别实现两个属性,或者写一些复杂的计算属性方法来生成全名。
示例代码
为了更好地展示 Virtuals 方法的使用,我们可以在一个真实的数据模型中,添加一些虚拟属性,让我们能够更好地理解其用法。
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ---------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- -- ------ - ----- ------- --------- ---- - --- --------------------------------------------- - ------ ------------------ ------------------ --- ------------------------------------------------ - ----- --- - ---------------------------------------------------------- ------ ----------------------------------------------- --- ----- ---- - ---------------------- ------------展开代码
在上述代码中,我们定义了一个包含三个属性的用户模型,分别为 firstName
, lastName
和 email
。在此基础上,我们添加了两个虚拟属性,分别为 fullName
和 gravatarUrl
。在 fullName
中,我们将 firstName
和 lastName
进行组合,并返回用户的全名;在 gravatarUrl
中,我们使用 Node.js 中的 crypto 库进行 MD5 加密,根据加密结果生成用户的 Gravatar 头像地址。
通过这样的定义,我们在获取用户数据时,可以直接读取虚拟属性,而无需额外的计算和操作。比如,我们可以通过以下方式获取一个用户对象,并利用其虚拟属性获取用户的全名和头像地址:
const user = await User.findOne({ email: 'test@example.com' }); console.log(user.fullName); // 'John Doe' console.log(user.gravatarUrl); // 'https://www.gravatar.com/avatar/xxxxxxxxxxxxxxxxxx?s=200'
综上所述,Virtuals 方法是 Mongoose 中一个常用的特性,通过使用虚拟属性,我们可以让代码更加符合封装的原则,使其更加简洁易读。在设计数据模型时,我们也应该充分考虑到 Virtuals 的使用,用于减少冗余代码,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d7aca8a941bf7134dbe450