mongodb聚合引用其他对象的对象

mongodb聚合引用其他对象的对象,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我在一个集合中有许多对象,它们与同一集合中的其他对象有关系。如何通过仅查询一个对象来获得该对象的完整关系 示例文档: {name:'emp1' reportsTo:'emp5'}, {name: 'emp5', reportsTo: 'lead1'} {name: 'lead1', reportsTo: 'mng1'} {name:'emp1' reportsTo:'mng1'}, {name:'emp2',reportsTo:'emp5'} 如果我查询“emp1”,预期结果如下: {['e

我在一个集合中有许多对象,它们与同一集合中的其他对象有关系。如何通过仅查询一个对象来获得该对象的完整关系

示例文档:

{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
    }}  
])
我尝试了如下聚合函数:

 {['emp1', 'emp5', 'lead1', 'mng1'], ['emp1', 'mng1']}
db.getCollection('users').aggregate([{$match : {'name': 'emp1'}},
    {$reportsTo: reportsTo, $name:name},
    { $group : {
            name: $name
            reportsTo: $reportsTo
    }}  
])
您应该看到:


测试:

如果我再添加两个文档,如下所示(就像一个父级的多个子树){“name”:“Sr.mng1”,“reportsTo”:“DM”},{“name”:“DM”,“reportsTo”:“CEO”}我是否可以获得所有可能的路径,作为一个单独的层次结构?作为“子数组”或“不同数组”,以防在层次结构中出现相同的“reportingLevel”?@MithunS:reportingLevel是我们提供的一个数字,并且独立于集合中的每个文档,如果sr.mng1与mng1没有关系,您将不会在emp1中看到,但如果mng1向sr.mng1报告,您将得到一个数字,直到CEO为止,谢谢您的回复。我得到了第一层次中的所有预期文档,如您的答案所示。但我试图将它分开,比如-[emp1->emp5->lead1->mng1->Sr.mng1->VP]&[emp1->emp5->lead1->mng1->Sr.mng1->DM->CEO],如果中间有多条路径的话。由于Sr.mng1,这里的层次结构有两个方向。@MithunS:MongoDB无法完成所有工作,您需要为这些复杂的场景卸载一些代码,因此如果您检查此查询(),您将看到两个文档,用于
emp1
,第一个文档具有
DM
VP
as
“reportingLevel”:NumberLong(3)
原因它启动根级别为
“reportsTo”:“emp5”
&对于第二个文档,DM和VP都是
“reportingLevel”:NumberLong(1)
原因根级别为
“reportsTo”:“mng1”
。因此,在第一个文档的代码中,您必须编写逻辑来映射'Sr.Mng1'->'DM'->'CEO'和'Sr.Mng1'->'VP',因为mongo无法做到这一点。因此,如果我像这样重新设计DB结构,通过保留'reportsTo'数组,以防出现多个父级,有什么好处吗。如果是这样的话,会有更好的查询吗?[{“name”:“emp1”,“reportsTo”:[“emp5”,“mng1”]}]我希望在这种情况下也会出现同样的问题,并且需要处理代码中的某些部分。请确认。