0

I have a tree structure where each document points to its children.

Then I would like to perform a $graphLookup in some node, and get the nodes N levels down… But instead of getting the result in a list or array, I would like to get a nested document.

Is it possible to do this, some how?

Edited:

As an example, let's take the case from the documentation:

The collection employees has the following documents:

{ "_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" }

The operation performed is:

db.employees.aggregate( [
   {
      $graphLookup: {
         from: "employees",
         startWith: "$reportsTo",
         connectFromField: "reportsTo",
         connectToField: "name",
         as: "reportingHierarchy"
      }
   }
] )

And the result is:

{
   "_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" }
   ]
}

But let's say I would like the result in the form of a nested document instead of a list, like:

Dev
|-- Eliot
    |-- Ron
        |-- Asya
    |-- Andrew
        |--Dan

Edit 2

It doesn't matter much if the children are in an array or not. Any of the following would be ok, as long as the complete structure is nested:

{ 
  "_id" : 1, 
  "name" : "Dev",
  "children" : [
    {
       "_id" : 1, 
       "name" : "Eliot",
       "children": [...]
    }
  ]
}

{ 
  "_id" : 1, 
  "name" : "Dev",
  "children" : {
    {
       "_id" : 1, 
       "name" : "Eliot",
       "children": {...}
    }
  }
}
João Otero
  • 948
  • 1
  • 15
  • 30

0 Answers0