MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb:Holen Sie sich nur Blätter des Baumes

Wenn Sie ein Feld parent hinzufügen Um das übergeordnete Element für jeden Knoten zu erfassen, kann es hilfreich sein, die Abfrage für größere Datensätze zu optimieren. Zum Beispiel:

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

Dann können Sie $graphLookup (Aggregation) verwenden Operator zu durchlaufen.

Eine Alternative zu Ihrer Regex-Abfrage, um alle Kinder eines Baumknotens für #a#c zu erhalten :

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

Finde nur Blätter von #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}}
])

Ich würde auch empfehlen, Modellbaumstrukturen zu lesen , gibt es verschiedene Möglichkeiten, Baumdatenstrukturen in MongoDB zu verwenden. Abhängig von Ihrem Anwendungsfall sollten Sie bestimmte Strukturen für Ihre Anwendungsabfrage nutzen.