Mongoose 中的虚拟属性与 getters、setters 的区别详解

阅读时长 6 分钟读完

在 MongoDB 中,数据存储的方式是类似于文档的形式,而 Mongoose 是 MongoDB 的一种 Node.js 的 Object 预处理器,其灵活性和易于掌握的方法使得它成为了前端开发中最常用的工具之一。

在 Mongoose 中,虚拟属性是一种不会存储到 MongoDB 中的属性,但是它们可以在进行查询时被访问到。getters 和 setters 允许你在数据访问时进行一些计算或者转换,以实现更灵活的功能。

实现方式

虚拟属性和 getter/setter 可以在定义模型时通过 schema.virtual()schema.set() 方法来实现。下面我们分别介绍这两种方法的使用方式。

虚拟属性

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

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

上面的代码定义了一个 name 对象和一个名为 fullName 的虚拟属性。在 fullName 中,我们实现了一个 getter 来通过 name 对象中的 firstlast 字段来计算 fullName 的值。

getters/setters

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

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

上面的代码中,我们通过 schema.path() 方法来实现 fullName 的 getters 和 setters。在该方法中,我们需要添加 getterssetters 参数以启用这些 getter 和 setter。在定义的 getter 和 setter 中,我们使用 this 来访问当前实例,然后计算虚拟属性值并设置 name 对象的 firstlast 属性。

区别

虽然虚拟属性和 getter/setter 都可以实现在访问数据时的计算或转换,但是它们之间有一些不同之处。

虚拟属性

  • 虚拟属性不会在数据库中存储。
  • 虚拟属性可以是任何类型的数据。
  • 在查询时,虚拟属性可以使用查询条件或投影来访问,但不能用于查询排序或聚合的阶段。

getters/setters

  • getters 和 setters 可以应用于所有属性,而不仅仅是虚拟属性。
  • 使用 setters 可以在存储数据时进行一些计算或转换。
  • 因为 getters 和 setters 应用于存储数据,它们不需要被查询条件或投影进行访问。

示例

使用演示代码来加深对概念的理解。

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

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

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

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

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

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

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

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

在上面的例子中,我们创建了一个 Person 模型,并使用 virtual()path() 方法分别定义了三个虚拟属性和一个属性的 getter/setter。最后我们创建一个实例 person,并使用虚拟属性和 getter/setter 来访问数据。

结论

在本文中,我们介绍了 Mongoose 中虚拟属性和 getter/setter 两种不同的访问属性的方法。虚拟属性可以在查询时进行访问,但不会在数据库中存储,而 getter 和 setter 可以在存储数据时进行计算和转换。通过这两者,我们可以在 MongoDB 的文档形式中实现更为灵活的数据存储和访问方式。

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

纠错
反馈