mongodb - 在mongodb中查询不同的多级关系

标签 mongodb aggregation-framework database-relations

模拟示例。两个 mongodb 集合,departmentsemployees:

部门

{ _id: '101' }
{ _id: '102', parent: '101' }
{ _id: '103', parent: '101' }
{ _id: '104', parent: '103' }

员工

{ _id: '201', department: '101' }
{ _id: '202', department: '102' }
{ _id: '203', department: '102' }
{ _id: '204', department: '103' }
{ _id: '205', department: '104' }

如何查询一个部门或任何子部门中所有员工的列表(通过 department.parent 引用属性)?

所以对于上面的例子,查询:

  • 部门 101 应该给员工文件 201, 202, 203, 204, 205
  • 部门 102 应该给员工文件 202, 203, 204, 205
  • 部门 103 应该给员工文件 204, 205

如果无法查询部门树中“任意数量”的层级,那么给出“最多 N”层级结果的查询是完全可以接受的。

最佳答案

$lookup在 MongoDb 中对同一数据库中的未分片集合执行左外连接。

如果我们的集合之间有一层关系,那么我们可以 $lookup 对集合执行聚合。

假设我们在给定的样本集合中有一个级别的关系(比如一个部门到一个员工),那么聚合查询是

db.department.aggregate([
    {
      $lookup:
        {
          from: "employees",
          localField: "_id",
          foreignField: "department",
          as: "result"
        }
   }
]) 

只取Department集合的_id进行聚合,不取父部门关系进行聚合

上面给出的样本集合的结果是

{
        "_id" : "101",
        "result" : [
                {
                        "_id" : "201",
                        "department" : "101"
                }
        ]
}
{
        "_id" : "102",
        "parent" : "101",
        "result" : [
                {
                        "_id" : "202",
                        "department" : "102"
                },
                {
                        "_id" : "203",
                        "department" : "102"
                }
        ]
}
{
        "_id" : "103",
        "parent" : "101",
        "result" : [
                {
                        "_id" : "204",
                        "department" : "103"
                }
        ]
}
{
        "_id" : "104",
        "parent" : "103",
        "result" : [
                {
                        "_id" : "205",
                        "department" : "104"
                }
        ]
}

请注意,MongoDB 是一个 NoSQL 数据库,以这样一种方式设计我们的集合模式是一种很好的做法,即集合之间没有关系或关系很少。

关于mongodb - 在mongodb中查询不同的多级关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46233419/

相关文章:

java - Java保留时间的差异(以毫秒为单位)

node.js - mongoose如何防止已有用户名的用户修改用户名

node.js - 用于算术运算的 MongoDB 聚合 - 子文档字段

java - MongoDB/Java - 如何在 java 中为 mongodb 实现 $out

database - 一张表中多种类型对象的属性

javascript - 带有 NodeJS 驱动程序的 MongoDB 聚合游标

mongodb - 使用MongoDB _id字段作为多个字段的复合字段

mongodb - 如何在 mongodb 中使用 facet 操作查找字段的不同值

mysql - mySQL中的外键和NULL

cakephp - CakePHP 中的多重关系