指定されたノードの直接の子を見つけるには、まず、指定されたノードのすべての祖先を特定する必要があります。
特定のノードの先祖をすべて取得したら、直接の子を簡単に見つけることができます。
あなたが共有したリンクでは、以下はコレクション内のドキュメントです:
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" }