如何在 MongoDB 中获取祖先数组模式中节点的直接子节点
How do I get the immediate children of a node in the Array of Ancestors pattern in MongoDB
我有一个 mongo 数据库文档结构,它遵循祖先数组 (http://docs.mongodb.org/master/tutorial/model-tree-structures-with-ancestors-array/)
的模式
使用这种设计模式,如何获取节点的直接子节点?
A
|---|---|
| |
B D
| |
E F
所以给定节点 A,我想查询 return 节点 B 和 D 的文档
为了找出给定节点的直接子节点,首先需要识别给定节点的所有祖先。
一旦获得给定节点的所有祖先,就可以轻松找到直接子节点。
在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 } )
例如,我们需要找到节点 "Databases" 的直接子节点。
为此,我们首先需要获取给定节点的所有祖先 "Databases"。
所以我们可以通过下面的查询找到它:
var anst = db.categories.find({_id:"Databases"},{_id:0, ancestors : 1 }).toArray();
它将 return 我们得到以下输出:
[ { "ancestors" : [ "Books", "Programming" ] } ]
因此我们了解了节点 "Databases" 的所有祖先。
[=64] 中节点 ["Books"、"Programming"、"Databases"] 的 ONLY AND ALL 的文档=] 字段是节点 "Databases".
的直接子节点
要查找直系子级,我们可以使用以下查询:
anst[0].ancestors.push("Databases");
db.categories.find(
{ "ancestors":
{ $all : anst[0].ancestors ,
$size: anst[0].ancestors.length
}
}
);
这将 return 我们以下文件 :
{ _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases"}
{ _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" }
这里 $size 对我们很重要,因为我们只需要那些只有 [ "Books", "Programming", "Databases" 的文档] 因为有 "ancestors".
另一个例子 :
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" }
因为每个节点都有一个父 ID,所以你可以通过
`db.yourCollection.find( { parent: "A" } )`
我有一个 mongo 数据库文档结构,它遵循祖先数组 (http://docs.mongodb.org/master/tutorial/model-tree-structures-with-ancestors-array/)
的模式使用这种设计模式,如何获取节点的直接子节点?
A
|---|---|
| |
B D
| |
E F
所以给定节点 A,我想查询 return 节点 B 和 D 的文档
为了找出给定节点的直接子节点,首先需要识别给定节点的所有祖先。
一旦获得给定节点的所有祖先,就可以轻松找到直接子节点。
在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 } )
例如,我们需要找到节点 "Databases" 的直接子节点。
为此,我们首先需要获取给定节点的所有祖先 "Databases"。
所以我们可以通过下面的查询找到它:
var anst = db.categories.find({_id:"Databases"},{_id:0, ancestors : 1 }).toArray();
它将 return 我们得到以下输出:
[ { "ancestors" : [ "Books", "Programming" ] } ]
因此我们了解了节点 "Databases" 的所有祖先。
[=64] 中节点 ["Books"、"Programming"、"Databases"] 的 ONLY AND ALL 的文档=] 字段是节点 "Databases".
的直接子节点要查找直系子级,我们可以使用以下查询:
anst[0].ancestors.push("Databases");
db.categories.find(
{ "ancestors":
{ $all : anst[0].ancestors ,
$size: anst[0].ancestors.length
}
}
);
这将 return 我们以下文件 :
{ _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases"}
{ _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" }
这里 $size 对我们很重要,因为我们只需要那些只有 [ "Books", "Programming", "Databases" 的文档] 因为有 "ancestors".
另一个例子 :
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" }
因为每个节点都有一个父 ID,所以你可以通过
`db.yourCollection.find( { parent: "A" } )`