У меня есть структура дерева монго, которая выглядит так:
{"_id":uid1,"parent": null, "path": "#uid1", "name": "a"}
{"_id":uid2,"parent": "uid1", "path": "#uid1#uid2", "name": "b"}
{"_id":uid3,"parent": "uid1", "path": "#uid1#uid3", "name": "c"}
{"_id":uid4,"parent": "uid2", "path": "#uid1#uid2#uid4", "name": "1"}
{"_id":uid5,"parent": "uid2", "path": "#uid1#uid2#uid5", "name": "2"}
{"_id":uid6,"parent": "uid1", "path": "#uid1#uid6", "name": "1"}
{"_id":uid7,"parent": "uid6", "path": "#uid1#uid6#uid7", "name": "x"}
где каждый узел представлен своим уникальным идентификатором uidx и расположен благодаря uid своего родителя. Каждый раз, когда родитель узла изменяется, его путь и пути его дочерних элементов автоматически изменяются (внутри предварительного сохранения мангуста).
Приведенный выше пример можно представить следующим образом:
a
|_b
| |_1
| |_2
|_c
|_1
|_x
Моя цель — создать запрос, который будет получать только листья под указанным узлом.
Если бы я сохранил родительский путь внутри родительского поля, а не только родительский идентификатор, я смог бы сделать это, используя следующий запрос:
db.tree.aggregate([
{$match:{"parent": {$regex:"^#uid1#uid2"}}},
{$graphLookup:{
from:"tree",
startWith:"$path",
connectFromField:"path",
connectToField:"parent",
as:"dep"}},
{$match:{dep:[]}},
{$project:{"_id":0, path:1}}
])
как уже было дано ответ в моем предыдущем вопросе здесь: Mongodb: получить только листья дерева
Проблема в том, что я этого не сделал.
Поэтому мне нужно каким-то образом преобразовать «connectToField» в моем запросе, чтобы он представлял путь моего родителя, а не идентификатор моего родителя. Кто-нибудь знает, как это сделать?
Этот вопрос является переписанной версией моего предыдущего вопроса здесь: предыдущая версия