<aside> ✅ Hierarchy 구조 (Tree 구조)

Graph 형태의 데이터 ex. 회사의 결재선, 쇼핑몰 카테고리, SNS

</aside>

db.employees.insertMany([
	{
		_id: 1,
		name: "유진",
		position: "CEO"
	},
	{
		_id: 2,
		name: "서원",
		position: "지각쟁이",
		reportsTo: "유진"
	},
	{
		_id: 3,
		name: "동히",
		position: "난초물주기",
		reportsTo: "서원"
	},
	{
		_id: 4,
		name: "문규",
		position: "개발자 및 기획자 및 디자이너",
		reportsTo: "동히"
	}
])
// graphLookup을 이용하면 계층 구조를 쉽게 나타낼 수 있음
> db.employees.aggregate([
... 	{
... 		$graphLookup: {
... 			from: "employees",   // 재귀 형식
... 			startWith: "$reportsTo",
... 			connectFromField: "reportsTo",
... 			connectToField: "name",
... 			depthField: "depth",
... 			as: "reportingHierarchy"
... 		}
... 	}
... ])
[
  { _id: 1, name: '유진', position: 'CEO', reportingHierarchy: [] },
  {
    _id: 2,
    name: '서원',
    position: '지각쟁이',
    reportsTo: '유진',
    reportingHierarchy: [ { _id: 1, name: '유진', position: 'CEO', depth: Long("0") } ]
  },
  {
    _id: 3,
    name: '동히',
    position: '난초물주기',
    reportsTo: '서원',
    reportingHierarchy: [
      { _id: 1, name: '유진', position: 'CEO', depth: Long("1") },
      {
        _id: 2,
        name: '서원',
        position: '지각쟁이',
        reportsTo: '유진',
        depth: Long("0")
      }
    ]
  },
  {
    _id: 4,
    name: '문규',
    position: '개발자 및 기획자 및 디자이너',
    reportsTo: '동히',
    reportingHierarchy: [
      { _id: 1, name: '유진', position: 'CEO', depth: Long("2") },
      {
        _id: 3,
        name: '동히',
        position: '난초물주기',
        reportsTo: '서원',
        depth: Long("0")
      },
      {
        _id: 2,
        name: '서원',
        position: '지각쟁이',
        reportsTo: '유진',
        depth: Long("1")
      }
    ]
  }
]