【问题标题】:Query varying multi-level relations in mongodb在 mongodb 中查询不同的多级关系
【发布时间】:2018-02-24 06:47:25
【问题描述】:

模拟示例。两个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”级别结果的查询是完全可以接受的。

【问题讨论】:

标签: mongodb aggregation-framework database-relations


【解决方案1】:

$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 数据库,最好将我们的集合模式设计为​​集合之间没有关系或关系非常少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多