Mongoose 子文档的使用

阅读时长 6 分钟读完

在 MongoDB 中,文档可以嵌套其他文档,这就是所谓的子文档。在 Mongoose 中,我们可以通过定义子文档来方便地处理这种文档嵌套的情况。本文将详细介绍 Mongoose 子文档的使用,包括定义子文档、存储、更新、查询等方面。

定义子文档

在 Mongoose 中,我们可以使用 mongoose.Schema 来定义子文档。假设我们有一个名为 Book 的模型,其中包含一个 Author 子文档,我们可以如下方式来定义 Author

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

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

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

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

注意,子文档 Author 是一个单独的 Schema,并不需要单独注册为模型,直接使用嵌套的方式定义即可。

存储子文档

在存储 Book 文档时,我们可以直接将 Author 作为一个对象传递给 Book 的构造函数,也可以先创建 Author 对象,再将其作为属性赋值给 Book 对象。下面是两种方式的示例代码:

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

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

在数据库中存储的文档如下所示:

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

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

可以看到,Author 子文档被嵌套在 Book 文档中存储。

更新子文档

在更新 Book 文档中的 Author 子文档时,我们可以直接更新 Book 对象的 author 属性,也可以通过 findOneAndUpdate() 等方法来更新。下面是两种方式的示例代码:

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

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

在数据库中更新后的文档如下所示:

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

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

可以看到,Author 子文档被正确更新。

查询子文档

在查询 Book 文档中的 Author 子文档时,我们可以使用 populate() 方法来将 Author 子文档展开。下面是示例代码:

在控制台输出的结果如下所示:

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

可以看到,Author 子文档被正确展开。

总结

本文介绍了 Mongoose 子文档的使用,包括定义子文档、存储、更新、查询等方面。子文档的使用使得数据库中的文档嵌套更加方便,减少了多集合查询的开销,提高了查询效率。在实际开发中,我们可以根据具体情况来灵活使用子文档,提高代码的可读性和可维护性。

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

纠错
反馈