Mongoose 中的关联查询详解

阅读时长 8 分钟读完

在进行 Web 开发时,我们常常需要处理多个模型之间的关联数据。Mongoose 提供了方便的方式来进行关联查询,让我们轻松地处理这些数据。本文将介绍 Mongoose 中的关联查询的基本概念和详细用法,并附上示例代码。

什么是关联查询

在 MongoDB 中,我们可以使用 $lookup 操作符进行关联查询。$lookup 操作符让我们可以在一次查询中查询多个集合并将结果进行合并。例如,我们有一个用户集合和一个帖子集合,每个用户有多个帖子。我们可以使用 $lookup 操作符查询出每个用户的所有帖子。

在 Mongoose 中,关联查询有多种实现方式,包括嵌套对象、子文档、引用和联合查询。本文将重点介绍引用和联合查询这两种方式。

引用

引用是一种使用 ID 关联两个模型的方式。例如,我们有一个用户模型和一个帖子模型。每个帖子都有一个作者 ID,我们可以通过这个 ID 找到对应的用户。这种方式被称为引用。在 Mongoose 中,我们可以定义模型的字段为 ObjectId 类型,并使用 populate() 方法进行关联查询。

定义模型

首先,我们来定义用户模型和帖子模型。

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

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

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

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

在帖子模型中,我们定义了一个 author 字段,类型为 ObjectId,引用了 User 模型。ref 属性指定了关联的模型名称。

创建数据

接下来,我们来创建一些数据。

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

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

在这里,我们创建了两个用户和三篇帖子,其中两篇帖子的作者是 Tom,一篇帖子的作者是 Jerry。注意,在 post1、post2 和 post3 中,我们使用 user1._id 和 user2._id 来引用对应的用户。

查询数据

接下来,我们来尝试查询一下帖子并将每个帖子的作者信息加入结果中。

在这里,我们使用 populate() 方法将 author 字段关联到 User 模型上。它会自动在查询中将对应的用户信息加入结果中。

运行上述代码,我们可以得到以下结果:

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

在这里,我们可以看到每篇帖子的作者信息已经被添加到结果中了。

联合查询

联合查询是另一种在 Mongoose 中进行关联查询的方式。它的实现方式与引用相比更加灵活,但也更加复杂。在联合查询中,我们需要手动编写聚合管道,并使用 $lookup 操作符将两个集合联合起来。下面是一个简单的例子:

定义模型

我们仍然使用上面的用户模型和帖子模型。

创建数据

同样,我们创建两个用户和三篇帖子的数据。

查询数据

我们来尝试查询每个用户的所有帖子,并将结果按照用户分组。

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

在这里,我们首先使用 $lookup 操作符将帖子和用户集合关联起来。from 属性指定要关联的集合名称,localField 属性指定帖子集合中要关联的字段,foreignField 属性指定用户集合中要关联的字段,as 属性指定结果中要显示的字段名。然后,我们使用 $group 操作符将结果按照作者分组,并将每个作者的所有帖子保存到 posts 数组中。

运行上述代码,我们可以得到以下结果:

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

在这里,我们可以看到查询结果已经按照作者分组,并将每个作者的所有帖子保存在了 posts 数组中。

总结

关联查询是进行 Web 开发中不可或缺的技术之一。在 Mongoose 中,我们可以使用引用和联合查询来进行关联查询。引用是一种简单的关联方式,但也有一些限制;联合查询比引用更加灵活,但使用起来也更加复杂。根据实际情况选择合适的方式可以提高开发效率并保证代码质量。

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

纠错
反馈