MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongodb:prendi solo foglie di albero

Se aggiungi un campo parent per acquisire il genitore per ogni nodo, può aiutare a ottimizzare le query su set di dati più grandi. Ad esempio:

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

Quindi puoi utilizzare $graphLookup (aggregazione) operatore da attraversare.

Un'alternativa alla tua query regex per ottenere tutti i figli di un nodo albero per #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}}
])

Trova solo foglie di #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}}
])

Consiglierei anche di rivedere Strutture ad albero del modello , ci sono vari modi per utilizzare le strutture di dati ad albero in MongoDB. A seconda del tuo caso d'uso, dovresti utilizzare determinate strutture per i vantaggi della query dell'applicazione.