Mongoose Schema 的虚拟属性详解及用法

阅读时长 6 分钟读完

在使用 Mongoose 进行 MongoDB 数据库操作的过程中,Schema 是我们必须了解的一个重要概念,它用来定义数据模型的结构和属性。而虚拟属性(Virtual)是 Schema 中一个非常强大的特性,它能够让我们以一种更加灵活、自由的方式操作数据库。

什么是 Mongoose Schema?

Mongoose 是一个 Node.js 开发环境中非常流行的 ODM(Object Document Mapping)工具。开发者可以通过 Mongoose 的 Schema 来定义 MongoDB 集合中的文档结构、数据类型、默认值等,与 MongoDB 的操作相比,可以更加简洁、直观地进行数据操作,可以更好地满足开发者的需求。

Mongoose 的 Schema 由一个个的 SchemaType(字段类型)组成,每种类型都有自己的特定设置。例如:

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

上述代码中,Schema 中定义了 name、age、address 和 created 四个字段,分别对应了不同的数据类型和设置。

虚拟属性是什么?

虚拟属性(Virtual)是 Mongoose Schema 中非常重要和强大的特性之一,顾名思义,它并不实际存储于数据库中,而是通过计算得出。虚拟属性通常用于模型间的关联查询、字段的格式化输出等。

通常情况下,虚拟属性的定义是这样的:

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

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

如何定义一个虚拟属性?

我们可以通过 schema.virtual(path[, options]) 来定义虚拟属性,其中,path 代表虚拟属性的名称,可以是字符串或路径表达式,options 是一个可选对象,用来设置虚拟属性的类型、计算方式等。

例如:

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

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

在上述代码中,虚拟属性 fullName 计算方式以 getter 函数形式返回了 firstName 和 lastName 字段的拼接字符串。我们这样使用:

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

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

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

注意事项

需要注意建议设置虚拟属性的 getter 是否是同步函数,如果不是,则意味着查询虚拟属性时可能需要等待异步操作的结果。

如何使用虚拟属性?

虚拟属性和其他属性一样可以和其他属性一样使用,包括设置、获取、查询、更新等各种操作。在使用虚拟属性时,我们只需要像普通字段一样赋值、获取即可,无需关注虚拟属性的计算方式。

例如:

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

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

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

注意事项

虚拟属性不能作为查询条件,因为它并不存在于数据库中。

优点与适用场景

虚拟属性对于数据库记录的可读性和可操作性很有帮助,特别是当数据集合非常复杂时。在进行集合查询时,虚拟属性可以被用来计算、格式化和过滤数据,这非常实用。

虚拟属性的适用场景包括但不限于:

  • 对集合中特定字段进行计算和格式化,例如日期类型的字段;
  • 处理集合中字段之间的关联查询;
  • 过滤和搜索较更复杂的数据集合。

示例代码

下面这个示例程序将定义一个 Mongoose 模式,该模式为一个简单的用户记录定义了一个虚拟属性,然后创建了一个名为“user”的集合,将数据批量插入数据库。

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

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

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

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

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

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

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

结论

虚拟属性是 Mongoose Schema 中非常实用的一个特性,它不仅让我们能够更加灵活地定义文档结构、数据类型和字段行为,还增强了代码的可读性和可操作性,为我们处理更复杂的数据集合带来了方便。

在日常开发中,如果需要对数据库记录进行计算、格式化和过滤等操作,虚拟属性绝对是我们的强大工具之一,值得深入学习和使用。

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

纠错
反馈