MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongodb:obtenha apenas folhas de árvore


Se você adicionar um campo parent para capturar o pai de cada nó, pode ajudar a otimizar a consulta em um conjunto de dados maior. Por exemplo:
{"parent": "", "node": "#a"}
{"parent": "#a", "node": "#a#b"}
{"parent": "#a", "node": "#a#c"}
{"parent": "#a#b", "node": "#a#b#1"}
{"parent": "#a#b", "node": "#a#b#2"}
{"parent": "#a#c", "node": "#a#c#1"}
{"parent": "#a#c#1", "node": "#a#c#1#x"}

Então você pode utilizar $graphLookup (aggregation) operador a percorrer.

Uma alternativa à sua consulta regex para obter todos os filhos de um nó de árvore para #a#c :
db.tree.aggregate([
        {$match:{"node":"#a#c"}}, 
        {$graphLookup:{
                       from:"tree", 
                       startWith:"$node", 
                       connectFromField:"node", 
                       connectToField:"parent", 
                       as:"dep"}}, 
        {$project:{"dep.node":1, "_id":0}}
])

Encontrar apenas folhas de #a#c :
db.tree.aggregate([
        {$match:{"parent": {$regex:"^#a#c"}}}, 
        {$graphLookup:{
                       from:"tree", 
                       startWith:"$node", 
                       connectFromField:"node", 
                       connectToField:"parent", 
                       as:"dep"}}, 
        {$match:{dep:[]}}, 
        {$project:{"_id":0, node:1}}
])

Também recomendo revisar Modelo de estruturas de árvore , existem várias maneiras de usar estruturas de dados em árvore no MongoDB. Dependendo do seu caso de uso, você deve empregar certas estruturas para os benefícios de consulta do seu aplicativo.