在 Mongoose 中使用 populate 查找嵌套对象

阅读时长 4 分钟读完

Mongoose 是一个在 Node.js 中使用的优秀的 MongoDB ORM 库,它可以让开发者以面向对象的思想来操作 MongoDB 数据库,提供了很多方便的 API 帮助快速实现数据 CRUD 操作。其中 populate 方法可以帮助我们查询嵌套对象,本文将详细介绍如何使用 Mongoose 中的 populate 方法进行嵌套对象的查找。

嵌套对象的结构

在 MongoDB 中,数据存储是以 BSON(Binary JSON)格式进行的,它支持嵌套对象的存储。例如,我们有以下两个模型:

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

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

从上述代码可以看出,用户模型中有姓名、年龄以及一组文章信息,文章模型中有标题、内容和发布者信息。这样的数据结构使得我们可以通过 MongoDB 中的 $lookup 方法非常方便地查询嵌套对象中的数据。

使用 populate 方法查询嵌套对象

Mongoose 提供的 populate 方法可以帮助我们将文档中的一个属性替换为另一个关联的集合中的文档,实现数据的联表查询,具体使用方式如下:

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

这里的 populate 方法中,参数 posts 表示关联集合的名称,这个名称是对应 Model 中的 ref 属性。执行上述代码,将查找姓名为张三的用户,并将其 posts 属性替换为关联集合的文档数组,最终将结果打印出来。

如果需要查询嵌套对象中的嵌套对象,我们可以在参数中使用点操作符:

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

这里 poster 是文章模型中的关联用户,使用点操作符可以查询到嵌套对象中的属性。执行上述代码,将查询标题为 Mongoose 的使用 的文章,并将其 poster 属性替换为关联用户的文档,最终将结果打印出来。

我们也可以使用多个参数来实现多重嵌套对象的查询,例如:

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

这里的 comments 是文章模型中的评论列表,user 是评论中的用户信息。上面的代码会将所有文章查询出来,并将 postercomments[].user 两个属性替换为关联集合中的文档,最终将结果打印出来。

总结

在 Mongoose 中使用 populate 方法可以很方便地查询嵌套对象中的数据,本文介绍了使用 populate 方法进行嵌套对象查询的方法和注意事项,希望对读者有所帮助。要注意的是,在进行查询之前,相关的 Model 必须先进行注册和定义,否则会出现找不到 Model 的错误。

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

纠错
反馈

纠错反馈