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.