-1

Category list like

my category list

Expected out

 [
    {
        "_id": "5f04bb4afce61722a8e3ca0f",
        "parentCategoryCode": null,
        "title": "Novelty",
        "childrens": [
            {
                "_id": "5f04bb8bfce61722a8e3ca19",
                "parentCategoryCode": "5f04bb4afce61722a8e3ca0f",
                "title": "Novelty Subcategory A",
                "childrens": [
                    {
                        "_id": "5f1081a5b2b56223a910bf25",
                        "parentCategoryCode": "5f04bb8bfce61722a8e3ca19",
                        "title": "Novelty Sub A Level 2"
                    }
                ]
            } 
        ]
    } 
     
]

i have mongodb database and i looking for recursive category from single collection. it can be multiple level deep relation of category

manoj patel
  • 1,150
  • 12
  • 10

1 Answers1

0

Use $graphLookup. It performs a recursive Search on collection.With option with RestrictSearchwithMatch option.

{
   $graphLookup: {
      from: <collection>,
      startWith: <expression>,
      connectFromField: <string>,
      connectToField: <string>,
      as: <string>,
      maxDepth: <number>,
      depthField: <string>,
      restrictSearchWithMatch: <document>
   }
}

Example of Employee Collection

{ "_id" : 1, "name" : "Jack" }
{ "_id" : 2, "name" : "Peter", "reportsTo" : "Jack" }
{ "_id" : 3, "name" : "Sara", "reportsTo" : "Peter" }
{ "_id" : 4, "name" : "Zied", "reportsTo" : "Peter" }
{ "_id" : 5, "name" : "Richard", "reportsTo" : "Sara" }
{ "_id" : 6, "name" : "Mitch", "reportsTo" : "Zied" }

Here we are going to match ReportsTo with Name field.

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

Output :

{
   "_id" : 1,
   "name" : "Jack",
   "reportingHierarchy" : [ ]
}
{
   "_id" : 2,
   "name" : "Peter",
   "reportsTo" : "Jack",
   "reportingHierarchy" : [
      { "_id" : 1, "name" : "Jack" }
   ]
}
{
   "_id" : 3,
   "name" : "Sara",
   "reportsTo" : "Peter",
   "reportingHierarchy" : [
      { "_id" : 1, "name" : "Jack" },
      { "_id" : 2, "name" : "Peter", "reportsTo" : "Jack" }
   ]
}
{
   "_id" : 4,
   "name" : "Zied",
   "reportsTo" : "Peter",
   "reportingHierarchy" : [
      { "_id" : 1, "name" : "Jack" },
      { "_id" : 2, "name" : "Peter", "reportsTo" : "Jack" }
   ]
}
{
   "_id" : 5,
   "name" : "Richard",
   "reportsTo" : "Sara",
   "reportingHierarchy" : [
      { "_id" : 1, "name" : "Jack" },
      { "_id" : 2, "name" : "Peter", "reportsTo" : "Jack" },
      { "_id" : 3, "name" : "Sara", "reportsTo" : "Peter" }
   ]
}
{
   "_id" : 6,
   "name" : "Mitch",
   "reportsTo" : "Zied",
   "reportingHierarchy" : [
      { "_id" : 1, "name" : "Jack" },
      { "_id" : 2, "name" : "Peter", "reportsTo" : "Jack" },
      { "_id" : 4, "name" : "Zied", "reportsTo" : "Peter" }
   ]
}
Viral Patel
  • 1,104
  • 4
  • 7