Mongodb将许多集合的查找聚合到一个嵌套输出

时间:2018-05-04 04:42:17

标签: mongodb mongodb-query aggregation-framework

我有3个收藏:

学校

{   "id" : { "$numberLong" : "100000" },         
    "name" : "School1" }

{   "id" : { "$numberLong" : "100000" }, 
    "schoolId" : { "$numberLong" : "100000" }, 
    "name" : "Faculty1" }

主题

{   "id" : { "$numberLong" : "100000" },       
    "name" : "Subject1" }

假设每个集合中有很多这些。我希望能够提供一个接收ID的端点并返回完整的3层层次(学校 - > Faculty-> Subject)。我将如何返回所有这些数据。

类似的东西:

{
    id: 1,
    name: "school1", 
    faculties: [{
        id:1000, 
        name: "faculty1", 
        subjects: [
            {id: 1, name: "sub1"},
            {id: 2, name: "sub2"},
            {id: 3, name: "sub3"}
        ]
    }]
}

2 个答案:

答案 0 :(得分:1)

.pot

答案 1 :(得分:0)

好久以后我实际上得到了解决方案,这比兔子洞要简单得多。

{ $match: {id: 100001}},
{ $lookup:
    {
        from: 'faculties',
        localField: 'id',
        foreignField: 'schoolId',
        as: 'faculties',
    }
},
{ $unwind: {
    path: "$faculties",
    preserveNullAndEmptyArrays: true
  }
},
{ $lookup:
    {
        from: 'subjects',
        localField: 'faculties.id',
        foreignField: 'facultyId',
        as: 'faculties.subjects',
    }
}  

返回我想要的确切输出。关键是最终查找返回as: 'faculties.subjects',将主题放入院内,这是学校的第一个孩子。

如果您需要进一步嵌套,每次深入时只需要as: faculties.subjects.students.names