sql >> Base de Datos >  >> NoSQL >> MongoDB

Mongodb:obtener solo hojas de árbol

Si agrega un campo parent para capturar el padre de cada nodo, puede ayudar a optimizar las consultas en un conjunto de datos más grande. Por ejemplo:

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

Entonces puede utilizar $graphLookup (agregación) operador para atravesar.

Una alternativa a su consulta de expresiones regulares para obtener todos los elementos secundarios de un nodo de árbol 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}}
])

Encuentra solo hojas 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}}
])

También recomendaría revisar Model Tree Structures , hay varias formas de usar estructuras de datos de árbol en MongoDB. Dependiendo de su caso de uso, debe emplear ciertas estructuras para los beneficios de consulta de su aplicación.