sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb:få bara löv av träd

Om du lägger till ett fält parent för att fånga föräldern för varje nod kan det hjälpa att optimera förfrågningar på större datauppsättning. Till exempel:

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

Då kan du använda $graphLookup (aggregation) operatör att passera.

Ett alternativ till din regex-fråga för att få alla barn till en trädnod för #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}}
])

Hitta bara blad av #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}}
])

Jag skulle också rekommendera att du granskar Modelträdstrukturer , det finns olika sätt att använda träddatastrukturer i MongoDB. Beroende på ditt användningsfall bör du använda vissa strukturer för dina applikationsfrågor.




  1. Spring Boot + MongoDB Id-fråga

  2. noder pass Fel:Okänd autentiseringsstrategi lokal-login

  3. Hur man skapar ett nytt arrayfält med det aggregerade ramverket

  4. Vad returneras från Mongoose-fråga som inte hittar några matchningar?