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.