У меня есть древовидная структура, где каждый документ указывает на своих потомков.
Затем я хотел бы выполнить $ graphLookup на каком-то узле и получить на узлах N уровней ниже ... Но вместо того, чтобы получить результат в виде списка или массива, я хотел бы получить вложенный документ.
Можно ли это как-то сделать?
Отредактировано:
В качестве примера давайте возьмем случай из документации :
Сотрудники сбора имеют следующие документы:
{ "_id" : 1, "name" : "Dev" }
{ "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" }
{ "_id" : 3, "name" : "Ron", "reportsTo" : "Eliot" }
{ "_id" : 4, "name" : "Andrew", "reportsTo" : "Eliot" }
{ "_id" : 5, "name" : "Asya", "reportsTo" : "Ron" }
{ "_id" : 6, "name" : "Dan", "reportsTo" : "Andrew" }
Выполнена операция:
db.employees.aggregate( [
{
$graphLookup: {
from: "employees",
startWith: "$reportsTo",
connectFromField: "reportsTo",
connectToField: "name",
as: "reportingHierarchy"
}
}
] )
И результат:
{
"_id" : 1,
"name" : "Dev",
"reportingHierarchy" : [ ]
}
{
"_id" : 2,
"name" : "Eliot",
"reportsTo" : "Dev",
"reportingHierarchy" : [
{ "_id" : 1, "name" : "Dev" }
]
}
{
"_id" : 3,
"name" : "Ron",
"reportsTo" : "Eliot",
"reportingHierarchy" : [
{ "_id" : 1, "name" : "Dev" },
{ "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" }
]
}
{
"_id" : 4,
"name" : "Andrew",
"reportsTo" : "Eliot",
"reportingHierarchy" : [
{ "_id" : 1, "name" : "Dev" },
{ "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" }
]
}
{
"_id" : 5,
"name" : "Asya",
"reportsTo" : "Ron",
"reportingHierarchy" : [
{ "_id" : 1, "name" : "Dev" },
{ "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" },
{ "_id" : 3, "name" : "Ron", "reportsTo" : "Eliot" }
]
}
{
"_id" : 6,
"name" : "Dan",
"reportsTo" : "Andrew",
"reportingHierarchy" : [
{ "_id" : 1, "name" : "Dev" },
{ "_id" : 2, "name" : "Eliot", "reportsTo" : "Dev" },
{ "_id" : 4, "name" : "Andrew", "reportsTo" : "Eliot" }
]
}
Но допустим, я хотел бы получить результат в виде вложенного документа вместо списка, например:
Dev
|-- Eliot
|-- Ron
|-- Asya
|-- Andrew
|--Dan
Редактировать 2
Не имеет большого значения, находятся ли дети в массиве или нет.Любое из следующего будет в порядке, пока вся структура вложена:
{
"_id" : 1,
"name" : "Dev",
"children" : [
{
"_id" : 1,
"name" : "Eliot",
"children": [...]
}
]
}
{
"_id" : 1,
"name" : "Dev",
"children" : {
{
"_id" : 1,
"name" : "Eliot",
"children": {...}
}
}
}