Mongoose 中的 Virtuals:虚拟属性和虚拟参考字段

阅读时长 6 分钟读完

虚拟属性和虚拟参考字段是 Mongoose 中非常重要的概念。虚拟属性是指在存储到数据库中之前,可以将一些属性计算出来,并将其添加到文档中。虚拟参考字段是指在一些文档中存储其他文档的引用,但是这些文档并不会真正存储到数据库中。

这篇文章将会详细地介绍 Mongoose 中的虚拟属性和虚拟参考字段,并提供一些实用的示例。

虚拟属性

在 Mongoose 中,虚拟属性是通过定义一个 getter 方法来实现。这个 getter 方法可以使用本地文档数据计算出一个新的值。

在下面的示例中,我们定义了一个叫做 fullName 的虚拟属性,用来拼接 firstNamelastName

-- -------------------- ---- -------
----- ------------ - --- -----------------
    ---------- -------
    --------- ------
---

----------------------------------------------- -
    ------ -------------- - - - - --------------
---

----- ------ - ------------------------ --------------

----- ------ - --- -------- ---------- ------- --------- ----- ---

----------------------------- -- ---- ---

这个 Person 模型有两个属性:firstNamelastName。但是,我们也对模型定义了一个虚拟属性 fullName。通过定义我们的 getter 方法,我们自动计算了属性 fullName 的值,它会返回 firstNamelastName 的拼接结果。

虚拟属性的另一个常见使用场景是计算某些文档中的属性值。例如,我们可以定义一个名为 age 的虚拟属性,计算出当前文档的年龄。

-- -------------------- ---- -------
----- ------------ - --- -----------------
    ------------ ----
---

------------------------------------------ -
    ----- --- - --- -------
    ----- ---- - --- - -----------------
    ----- --- - --------------- - -------------
    ------ ----
---

----- ------ - ------------------------ --------------

----- ------ - --- -------- ------------ --- ------------------ ---

------------------------ -- ----

在这个示例中,我们计算出了当前文档的年龄。我们首先定义了一个 dateOfBirth 属性,然后使用虚拟属性计算并返回当前年龄(以年为单位)。

虚拟属性还可以与其他属性进行组合。我们也可以计算整个文档的大小并将其保存在虚拟属性中。

-- -------------------- ---- -------
----- ------------ - --- -----------------
    ---------- -------
    --------- -------
    ---- ------
---

----------------------------------------------- -
    ------ ------------------
        -------------- - ------------- - --------------------
        ------
    --
---

----- ------ - ------------------------ --------------

----- ------ - --- -------- ---------- ------- --------- ------ ---- -- ---

----------------------------- -- --

在这个示例中,我们使用虚拟属性计算文档的大小,并将其保存在 dataSize 虚拟属性中。这个虚拟属性是通过将文档的所有属性拼接起来计算出来的,并使用 Buffer.byteLength() 计算该字符串的大小。

虚拟参考字段

虚拟参考字段允许我们在不显式存储文档的情况下建立文档之间的关联。下面是一个简单的示例,在这个示例中,博客文章和评论被定义为两个不同的模型。每个博客文章可以有多个评论,我们可以使用虚拟参考字段来实现这个关系。

-- -------------------- ---- -------
----- ---------- - --- -----------------
    ------ -------
    -------- ------
---

----- ------------- - --- -----------------
    ------ -------
    -------- ------
---

----------------------------- -
    ---- -------
    ----------- ------
    ------------- ----------
---

----- ---- - ---------------------- ------------
----- ------- - ------------------------- ---------------

----- ---- - --- ------ ------ --- ------ -------- ------- ------- ---
----- ------- - --- --------- ------ -- --------- -------- ----- ------ ---

------------- - ----------

-------------------------- -- - ---- ------ ------ --- ------ -------- ------- ------- -

在这个示例中,我们通过定义 commentSchema.virtual() 方法来创建虚拟参考字段。我们指定了参考文档的模型(Blog),关联字段的本地字段(_id)和参考模型的外键(comments)。

使用虚拟参考字段,我们可以轻松地通过评论找到相应的文章。例如,在上面的示例中,我们可以通过访问 comment.blog 来查询文章,不需要显式地存储任何关系。

总结

虚拟属性和虚拟参考字段是 Mongoose 中强大的概念。虚拟属性允许我们计算文档的属性值,而虚拟参考字段允许我们在不显式存储文档之间的关系的情况下建立文档之间的关联。

我们通过实际示例说明了如何使用虚拟属性和虚拟参考字段。我们希望这些示例可以帮助您更好地理解这些概念,并在您的 Mongoose 项目中发挥作用。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6475a148968c7c53b02a4232

纠错
反馈