1

祖先の配列のパターンに従うmongo DBドキュメント構造があります( http://docs.mongodb.org/master/tutorial/model-tree-structures-with-ancestors-array/ )

この設計パターンでは、ノードの直接の子を取得するにはどうすればよいですか?

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

したがって、ノード A が与えられた場合、クエリでノード B と D のドキュメントを返すようにしたいと思います。

4

2 に答える 2

0

指定されたノードの直接の子を見つけるには、まず、指定されたノードのすべての祖先を特定する必要があります。

特定のノードの先祖をすべて取得したら、直接の子を簡単に見つけることができます。

あなたが共有したリンクでは、以下はコレクション内のドキュメントです:

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" ] } ]

そのため、ノード「データベース」のすべての祖先を知ることができました。

「祖先」フィールドにノード [「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は重要です。なぜなら、「先祖」として [「書籍」、「プログラミング」、「データベース」] のみを含むドキュメントのみが必要だからです。

別の例:

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" }
于 2015-09-04T05:04:55.200 に答える