MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongodb :obtenir uniquement des feuilles d'arbre

Si vous ajoutez un champ parent pour capturer le parent de chaque nœud, il peut être utile d'optimiser l'interrogation sur un ensemble de données plus volumineux. Par exemple :

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

Ensuite, vous pouvez utiliser $graphLookup (agrégation) opérateur à parcourir.

Une alternative à votre requête regex pour obtenir tous les enfants d'un nœud d'arbre pour #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}}
])

Trouver uniquement les feuilles 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}}
])

Je recommanderais également de consulter les Structures d'arborescence de modèles , il existe différentes manières d'utiliser les structures de données arborescentes dans MongoDB. En fonction de votre cas d'utilisation, vous devez utiliser certaines structures pour les avantages de l'interrogation de votre application.