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

Mongodb:få kun blade af træ

Hvis du tilføjer et felt parent for at fange overordnet for hver node, kan det hjælpe med at optimere forespørgsler på større datasæt. For eksempel:

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

Så kan du bruge $graphLookup (aggregation) operatør at krydse.

Et alternativ til din regex-forespørgsel for at få alle børn af en træknude for #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}}
])

Find kun blade af #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}}
])

Jeg vil også anbefale at gennemgå Modeltræstrukturer , er der forskellige måder at bruge trædatastrukturer på i MongoDB. Afhængigt af dit brugstilfælde bør du anvende visse strukturer til fordelene ved din applikationsforespørgsel.




  1. MongoDB:java.lang.IllegalStateException:tilstand skal være:åben

  2. Konvertering af isodate til numerisk værdi

  3. Node.js SSH Tunneling til MongoDB ved hjælp af Mongoose

  4. Er det ok at omdanne mongo ObjectId til en streng og bruge det til URL'er?