什么是 MongoDB 连表查询?
MongoDB 是一个基于文档的 NoSQL 数据库管理系统。在 MongoDB 中,一个文档可以嵌套另一个文档,这就形成了一种层级化的数据结构。但是,在实际的业务场景中,我们经常需要从多个集合中取出相关的文档进行操作,这时我们就需要使用 MongoDB 的连表查询功能。
MongoDB 中的连表查询就是通过在多个集合之间建立关联,使得我们可以从一个集合中取出文档,并根据其关联字段查询其他集合中的文档。常见的关联方式有两种,即嵌套文档和引用文档。
嵌套文档查询
嵌套文档查询是 MongoDB 中最基本的查询方式。在一个文档中,我们可以嵌套其他的文档作为其属性值。例如,我们可以将一个用户的个人信息和其所属的部门信息存储在同一个文档中,如下所示:
-- -------------------- ---- ------- - ------ ------------------------------------- ------- ----- ------ --- ------- - ------- ------ ----------- ---- - -
在这个例子中,我们可以通过查询用户集合来获取每个用户所属的部门信息。
db.users.find({}).forEach(function(user) { print(user.name + ' - ' + user.dept.name); });
这个语句将返回所有用户的姓名和所属部门名称。
引用文档查询
引用文档查询是 MongoDB 中另一种常见的查询方式。在这种方式中,我们在不同的集合之间建立关联,而不是将一个文档嵌套在另一个文档中。例如,我们可以将部门信息存储在一个名为 depts
的集合中,并在用户集合中引用该集合中的文档。这时,用户集合中的每个文档都可以包含一个部门 ID 属性,如下所示:
{ "_id": ObjectId("60f94aa2a9f363110b368cd0"), "name": "张三", "age": 25, "dept_id": ObjectId("60f94c63a9f363110b368ce0") }
在这个例子中,dept_id
属性对应 depts
集合中的一个文档,我们可以根据部门 ID 查询该文档并获取其信息。例如,我们可以通过以下语句查询某个用户所属的部门名称:
-- -------------------- ---- ------- -------------------- - -------- - ----- -------- ----------- ---------- ------------- ------ --- ------ - -- - -------- ------- -- - ------- - ------ ------------------------------------ - -- - --------- - ---- -- ----- -- ------------ - - - ---
这个语句将返回 ID 为 60f94aa2a9f363110b368cd0
的用户的姓名和所属部门名称。在这个查询中,我们使用了 $lookup
操作符来进行连表查询,它的参数包括:
from
:指定关联的集合名称;localField
:指定当前集合中关联字段的名称;foreignField
:指定关联集合中关联字段的名称;as
:指定关联查询结果的属性名。
除此之外,我们还使用了 $unwind
操作符来展开 dept
属性的数组,以便对其进行进一步查询。最后,我们还使用了 $match
和 $project
操作符来过滤和投影查询结果。
总结
MongoDB 中的连表查询在实际的业务场景中非常常见。在进行连表查询时,我们需要根据具体的查询需求来选择使用嵌套文档查询或引用文档查询。无论使用哪种查询方式,我们都需要掌握 MongoDB 中的查询操作符和聚合操作,以便能够灵活运用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c895215ad90b6d041416d0