为了找出给定节点的直接子节点,首先需要识别给定节点的所有祖先。
一旦你得到给定节点的所有祖先,你就可以很容易地找到直接子节点。
在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" }