MongoDB $ graphLookup - возможно ли получить результат во вложенном документе? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть древовидная структура, где каждый документ указывает на своих потомков.

Затем я хотел бы выполнить $ 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": {...}
    }
  }
}
...