Mongoose 中的虚拟属性(Virtuals)详解

阅读时长 5 分钟读完

在 Mongoose 中,除了存储文档本身的属性以外,还可以定义虚拟属性(Virtuals),这些属性并不实际存储在数据库中,但是可以在文档中访问。虚拟属性的定义可以基于文档本身的数据,以及其他关联的集合文档数据。

虚拟属性的定义

在 Mongoose 中定义一个虚拟属性,需要在 Schema 中使用 getset 方法,例如:

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

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

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

在上面的例子中,定义了一个虚拟属性 fullName,它由 firstNamelastName 组合而成。get 方法返回值,set 方法将参数解构为 firstNamelastName 并分别存储到属性中。

虚拟属性的使用

虚拟属性的使用像普通属性一样,可以通过 toJSONtoObject 操作,也可以直接访问文档属性。例如:

虚拟属性的应用场景

虚拟属性的定义灵活,可以根据具体场景设计实现。以下是一些常见应用场景:

关联文档数据

虚拟属性可以通过关联的集合文档数据计算得出。例如:

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

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

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

在上面的例子中,定义了一个虚拟属性 authorEmail,它基于集合 User 中的 email 字段与集合 Post 中的 author 字段关联计算得出。set 方法将 email 解构为 author 对象,并存储到属性中,get 方法返回 author.email

计算统计数据

虚拟属性可以通过某些文档数据的统计计算得出。例如:

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

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

在上面的例子中,定义了一个虚拟属性 rating,它基于文档中 ratings 数组中的数据统计计算得出。如果 ratings 数组为空,则返回 null

总结

Mongoose 中的虚拟属性提供了一种灵活、可定制的方式处理特定场景的属性计算。对于一些不需要真正存储到数据库中的属性,或者需要根据特定关联计算得出的属性,虚拟属性是很好的解决方案。在使用虚拟属性的时候需要考虑其应用场景,确保在应用中得到恰当的使用和维护。

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

纠错
反馈