如何在 Mongoose 中实现右连接(right join)?

阅读时长 7 分钟读完

在开发前端应用程序时,我们通常需要与数据库进行交互,而 MongoDB 是一个非常流行的数据库。它使得数据存储和提取变得简单易行,同时,Mongoose 是一个流行的 Node.js 模块,可以帮助你更轻松地使用 MongoDB。

在数据库中,连接(join)是查询中非常强大并且常用的功能。它允许我们在两个或多个表之间建立关联,从而实现相互提取信息并生成有用的数据集。

MongoDB 和 Mongoose 中默认情况下只支持左连接(left join),但是在某些情况下,右连接(right join)也非常有用。在本文中,我们将解释右连接是什么,以及如何在 Mongoose 中实现右连接。

右连接是什么?

连接在数据库中是将两个或多个表中的数据行组合成一个具有关联表的结果集的过程。连接有两种类型-左连接和右连接。

  • 左连接:将左表连接至右表,并以左表行的每个行作为结果集中的一行。如果在右表中没有与左表的某个行关联的行,则在结果集中为该行添加 NULL 值。

  • 右连接:将右表连接到左表,并以右表行的每个行作为结果集中的一行。如果左表中没有与右表的某行关联的行,则在结果集中为该行添加 NULL 值。

在 MongoDB 和 Mongoose 中,默认情况下,使用左连接(left join)。但是,如果你需要执行右连接,你需要为实现它做一些 extra 的工作。

如何实现右连接?

在 Mongoose 中实现右连接需要执行以下步骤:

步骤 1 - 安装 mongoose-data-seed

mongoose-data-seed 是一个 Node.js 模块,允许我们使用 seed 文件填充数据。

步骤 2 - 创建 models

在 models.js 文件中定义两个 models:logins 和 users。

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

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

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

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

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

在上述 models.js 文件中,我们定义了两个模型 Login 和 User。

步骤 3 - 填充数据

在 seeds 文件夹中创建 login.seeds.js 和 user.seeds.js 两个文件,用于填充数据。

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

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

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

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

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

在上述 login.seeds.js 和 user.seeds.js 文件中,我们填充了数据。

步骤 4 - 编写查询

在我们开始写查询之前,首先需要进行连接。在这里,我们将两个表连接在一起,通过 user_id 和 login_id。

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

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

----------

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

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

在上面的代码中,我们使用了 mongoosemodels。我们使用 connect 函数进行连接。

可以看到,我们使用了 $lookup,设置了 from 的值为 loginslet 让我们可以将一个变量传递给到 pipeline 中。我们使用 $eq 进行 userInfo_id 和 login_id 的比较。

最后,将 loginuser 表进行组合。

步骤 5 - 运行查询

最后,我们需要运行这个查询,将其作为 seed 脚本进行执行。可以使用如下命令,运行它:

当你运行这个命令后,你将得到一个组合了 User 表和 Login 表的结果集。

通过以上 5 个简单步骤,就可以在 Mongoose 中实现右连接,让查询结果更加灵活。

总结

连接是在一次查询中将两个或多个表的数据组合成单个结果集的过程。Mongoose 和 MongoDB 中默认使用左连接,但在某些情况下,如需执行右连接,则需自己实现一些额外的操作。

在本文中,我们详细介绍了如何在 Mongoose 中实现右连接。如果你遇到了需要进行此类操作的情况,此方法将非常有用。

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

纠错
反馈