Mongoose 中如何使用 $lookup 进行关联查询

阅读时长 6 分钟读完

在 MongoDB 中,我们可以通过 $lookup 实现两个或多个集合之间的关联查询。 同样的,如果你使用基于 MongoDB 的 Mongoose ORM,你也可以通过 $lookup 方法轻松地实现关联查询。

本文将介绍在 Mongoose 中如何使用 $lookup进行关联查询,以及如何充分利用 $lookup的特性。

什么是 $lookup

$lookup 是 MongoDB 的一种聚合管道操作符,允许我们在一个集合中对字段进行查询和匹配,这些字段在其他集合中。 借助这个操作符,你可以创建的查询来充分利用数据之间的关系,从而获取组织以及更全面的视图。

在 Mongoose 中,$lookup 可以结合 .populate() 方法使用,这样我们就可以根据外键将一个数据库表中的数据添加到子文档当中,从而实现远程表的关联查询。

如何使用 $lookup 进行关联查询

下面我们将介绍使用 $lookup 方法进行关联查询的过程。 我们使用下面的两个集合进行演示。

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

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

在上面的例子中,第一个集合 users 存储了用户和他们分配的角色的信息。 第二个集合 roles 描述角色的详细信息。

要在 Mongoose 中进行关联查询,首先要在 users 集合定义中添加一个字段,该字段将保存从 roles 集合中提取的结果。

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

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

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

在定义完相关的 Mongoose 模板之后,我们可以使用下面的代码通过使用 $lookup 来实现关联查询:

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

在上述代码中,我们在查询 User 集合时使用了聚合管道的方法,并添加了 $lookup 操作符。 该操作符需要 from, localField, foreignFieldas 参数。

  • from 参数指定外部集合的名称。
  • localField 参数指定主集合中用于关联查询字段的属性名称。
  • foreignField 参数指定外部集合中在关联集合中要进行匹配的字段。
  • as 参数指定在主集合中存储关联数据的名称。

进阶应用

使用 $lookup 实现关联查询的过程中,还可以使用许多选项来微调查询。下面是一些使用 $lookup 操作符的进阶应用。

指定多个关联字段

除了 localField, foreignField,我们还可以指定其他的外部集合的多个关联字段。在下面的例子中,我们使用 pipeline 选项指定了在外部集合中使用的聚合管道。

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

在上述代码中,我们使用 $expr 操作符来处理外部集合中的聚合管道。 $let 操作符定义了一个变量 role_ids,该变量值为在主集合中存储的 role id。聚合管道选项定义了如何在外部集合中找到相应的查询结果。

使用嵌入式文档

使用嵌入的 document 类型进行关联查询是一种常见的技巧。 在下面的例子中,我们使用嵌入式的文档格式来实现关联查询。

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

在上述代码中,我们在第一步中使用了 $lookup 操作符来查询外部集合中与主集合相关联的文档。 然后我们使用 $project 操作符来重新组织我们的查询结果,返回一个包含内部嵌入文档结构的子集文档。

结论

在 Mongoose 中,使用 $lookup 操作符进行关联查询是相当简单的。 如果你采用正确的方式来组织关联查询,就可以让查询结果更加快速和高效。

在本文中,我们的示例代码展示了如何使用 $lookup 进行关联查询,并介绍了一些进阶应用的技巧。 希望这篇文章可以对你理解 $lookup 操作符的相关知识有所帮助,并且可以在你的实际项目中使用到。

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

纠错
反馈