Ако добавите поле parent
за улавяне на родителя за всеки възел, може да помогне за оптимизиране на заявките за по-голям набор от данни. Например:
{"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"}
След това можете да използвате $graphLookup (агрегиране) оператор за преминаване.
Алтернатива на вашата заявка за регулярен израз за получаване на всички дъщерни елементи на дървовиден възел за #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}}
])
Намерете само листа от #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}}
])
Бих препоръчал също да прегледате моделни дървовидни структури , има различни начини за използване на дървовидни структури от данни в MongoDB. В зависимост от вашия случай на употреба трябва да използвате определени структури за предимствата на заявките за вашето приложение.