【问题标题】:How do I get the immediate children of a node in the Array of Ancestors pattern in MongoDB如何在 MongoDB 的祖先数组模式中获取节点的直接子节点
【发布时间】:2015-09-03 19:38:48
【问题描述】:

我有一个遵循祖先数组 (http://docs.mongodb.org/master/tutorial/model-tree-structures-with-ancestors-array/) 模式的 mongo DB 文档结构

使用这种设计模式,我如何获得节点的直接子节点?

       A
   |---|---|
   |       |
   B       D
   |       |
   E       F

所以给定节点 A,我希望查询返回节点 B 和 D 处的文档

【问题讨论】:

    标签: mongodb ancestor


    【解决方案1】:

    为了找出给定节点的直接子节点,首先需要识别给定节点的所有祖先。

    一旦你得到给定节点的所有祖先,你就可以很容易地找到直接子节点。

    Link which you shared,下面是集合中的文档:

    db.categories.insert( { _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" } )
    db.categories.insert( { _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" } )
    db.categories.insert( { _id: "Databases", ancestors: [ "Books", "Programming" ], parent: "Programming" } )
    db.categories.insert( { _id: "Languages", ancestors: [ "Books", "Programming" ], parent: "Programming" } )
    db.categories.insert( { _id: "Programming", ancestors: [ "Books" ], parent: "Books" } )
    db.categories.insert( { _id: "Books", ancestors: [ ], parent: null } )
    

    比如说我们需要找到节点“数据库”的直接子节点。

    首先,我们需要获取给定节点“数据库”的所有祖先。

    所以我们可以通过以下查询找到它:

    var anst = db.categories.find({_id:"Databases"},{_id:0, ancestors : 1 }).toArray();
    

    它将返回我们以下输出:

     [ { "ancestors" : [ "Books", "Programming" ] } ]
    

    所以我们了解了节点“数据库”的所有祖先。

    在“祖先”字段中将包含 ONLY AND ALL 节点 [“Books”、“Programming”、“Databases”] 的文档是节点“Databases”的直接子节点.

    要查找直系子代,我们可以使用以下查询:

    anst[0].ancestors.push("Databases");
    
    db.categories.find(
                        { "ancestors": 
                                   { $all : anst[0].ancestors ,
                                     $size: anst[0].ancestors.length
                                   }
                        }
                      );
    

    这将返回我们以下文件:

    { _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases"}
    { _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" }
    

    这里 $size 对我们很重要,因为我们只需要那些只有 [ "Books", "Programming", "Databases" ] 作为“祖先”的文档。

    另一个例子

    var anst = db.categories.find({_id:"Programming"},{_id:0, ancestors : 1 }).toArray();
    

    输出:

    [ { "ancestors" : [ "Books" ] } ]
    

    我们可以查询如下:

    anst[0].ancestors.push("Programming");
    
    db.categories.find(
                       { "ancestors": 
                                    { $all : anst[0].ancestors ,
                                      $size: anst[0].ancestors.length
                                    }
                       }
                      );
    

    输出:

    { "_id" : "Databases", "ancestors" : [ "Books", "Programming" ], "parent" : "Programming" }
    { "_id" : "Languages", "ancestors" : [ "Books", "Programming" ], "parent" : "Programming" }
    

    【讨论】:

      【解决方案2】:

      由于每个节点都有一个父ID,所以你可以这样做

      `db.yourCollection.find( { parent: "A" } )`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多