Mongoose 多数据表数据查询的技巧详解

阅读时长 6 分钟读完

前言

随着 Web 应用及移动应用的发展,前端开发技术也在不断地更新和进化。在前后端分离的架构模式下,前端主要负责页面的展示和交互,而数据库操作等诸多重要功能则交由后端负责。

Mongoose 是基于 Node.js 平台的 MongoDB 的文档对象模型(简称 ORM,Object-Relational Mapping)。Mongoose 可以让 Node.js 开发者使用简单的代码,即可完成 MongoDB 数据库的操作。

在使用 Mongoose 进行多数据表的数据查询时,有许多值得一提的技巧和要点,本文将详细介绍这些技巧,并通过示例代码进行演示。

前置知识

在阅读本文之前,需要掌握以下知识:

  • Node.js 基础知识
  • MongoDB 基础知识
  • Mongoose 的基本使用方法

问题背景

假设现在有两个集合(相当于关系型数据库中的表):users 和 articles。其中,users 集合中保存了用户的相关信息,articles 集合中保存了文章的相关信息。此外,articles 集合中有一个字段 user,表示该文章对应的用户的id。

现在,我们需要根据用户id,查询该用户发表过的所有文章。

解决方案

Mongoose 提供了多种方法进行数据查询,下面我们将介绍一些常用的查询方式。

populate 方式

populate 方式是 Mongoose 实现多表查询的一种常用方式。populate 可以将一个属性从文档(document)引用到另一个集合(collection)。

在我们的例子中,我们可以先查询出指定用户的所有文章,然后将用户信息一起查询出来。具体实现方法如下:

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

-- ---------
-------- ---------------------------- -
  ------ -------------- ----- ------ --
              ----------------- -- - ---- --------
              -------
-
展开代码

在这个例子中,我们通过 Article.find({ user: userId }) 查询指定用户的所有文章;然后通过 .populate('user') 将 user 信息一起查询出来。

aggregate 方式

aggregate 方式是 Mongoose 查询方式中功能最强大的一种,它可以实现 MongoDB 中丰富的聚合操作。

我们通过 aggregate 方式进行查询时,需要使用到以下几个方法:

  • $lookup:类似于 SQL 中的 join 操作,将一个集合中的数据与另一个集合中的数据关联起来。
  • $match:在管道中添加查询条件。
  • $group:在管道中对数据进行分组计算。
  • $project:在管道中限定输出字段。

在我们的例子中,我们可以先使用 $match 找出指定用户的所有文章,再使用 $lookup 合并用户信息。具体实现方法如下:

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

-- ---------
-------- ---------------------------- -
  ------ -------------------
    -- - ---- -------
    - ------- - ----- ------------------------------- - --
    -- -- ---- -
    - -------- - ----- -------- ----------- ------- ------------- ------ --- ------ - --
    -- -- ---- --
    - -------- ------- -
  ---------
-
展开代码

在这个例子中,我们通过 Article.aggregate() 进行聚合操作;使用 $match 找出指定用户的所有文章;使用 $lookup 合并 user 信息,这里的 from 指定了用于关联的集合名,localField 指定了当前集合的关联字段,foreignField 指定了关联的集合的关联字段,as 指定了合并后的字段名;最后使用 $unwind 展开合并的数据。

$lookup 和 $project 方式

$lookup 和 $project 结合起来也可以实现多表查询,而且使用更加灵活。$lookup 用于关联表,$project 用于限定输出字段。

在我们的例子中,我们可以在 Article 中增加 user_info 字段,表示该文章对应的用户信息,然后使用 $lookup 和 $project 查询出指定用户的所有文章。具体实现方法如下:

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

-- ---------
-------- ---------------------------- -
  ------ -------------------
    -- - ---- -------
    - ------- - ----- ------------------------------- - --
    -- -- ---- -
    -
      -------- -
        ----- --------
        ----------- -------
        ------------- ------
        --- -----------
      -
    -
  --
  ----------
    ---- --
    ------ --
    -------- --
    ---------- - ------------- -------------- -- -  -- - --------- --------
  --
  -------
-
展开代码

在这个例子中,我们通过增加 user_info 字段保存用户信息;然后通过 $lookup 和 $project 查询出指定用户的所有文章。

总结

在本文中,我们讲解了 Mongoose 多数据表数据查询的技巧,主要包括 populate 方式、$lookup 和 $project 方式、以及 aggregate 方式。

使用 Mongoose 进行多表查询时,需要了解上述技巧和方法,并在实际开发中加以运用。同时,我们也需要根据实际业务需求进行合理的优化和拆分数据结构,以达到更好的性能和扩展性。

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

纠错
反馈

纠错反馈