mongodb для агрегирования объектов, имеющих ссылку на другие объекты - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть несколько объектов в коллекции, в которых они связаны с другими объектами в той же коллекции. Как я могу получить полную связь одного объекта, просто запросив только этот объект.

Образцы документов:

{name:'emp1' reportsTo:'emp5'},
{name: 'emp5', reportsTo: 'lead1'}
{name: 'lead1', reportsTo: 'mng1'}
{name:'emp1' reportsTo:'mng1'},
{name:'emp2',reportsTo:'emp5'}

Если я запрашиваю emp1, Ожидаемый результат выглядит следующим образом:

 {['emp1', 'emp5', 'lead1', 'mng1'], ['emp1', 'mng1']}

Я пробовал статистическую функцию следующим образом:

db.getCollection('users').aggregate([{$match : {'name': 'emp1'}},
    {$reportsTo: reportsTo, $name:name},
    { $group : {
            name: $name
            reportsTo: $reportsTo
    }}  
])

1 Ответ

0 голосов
/ 03 апреля 2020

Вы должны смотреть на $ graphLookup :

db.users.aggregate([
  {$match : {name : 'emp1'}},
  {
    $graphLookup: {
      from: "users",
      startWith: "$reportsTo", /** For matched docs from `$match` pick 'reportsTo' field & start connecting it with 'name' in other docs */
      connectFromField: "reportsTo",
      connectToField: "name",
      as: "reportingHierarchy", /** Pushes matched docs to this array */
      maxDepth: 3, /** Search upto 4 levels of reporting structure */
      depthField: "reportingLevel" /** This field explains relation */
    }
  }
])

Тест: MongoDB-Playground

...