2017-08-25 139 views
2

我想通過使用mongodb的聚合框架來做一個嵌套的人口,我有一些麻煩與它。

這是我最初的數據:

[ 
    { 
    _id: ObjectId('123'), 
    profileId: ObjectId('456') 
    }, 
    // ...other documents 
] 

我將此聚合管道,所以我可以用profileId場填充profile領域:

MyModel.aggregate([ 
    { 
    $lookup: { 
     from: 'profiles', 
     localField: 'profileId', 
     foreignField: '_id', 
     as: 'profile' 
    } 
    }, 
    { 
    $project: { 
     profile: { 
     $arrayElemAt: [ '$profile', 0 ] 
     }, 
     profileId: 1, 
    } 
    }, 
] 

而且這是結果:

[ 
    { 
    _id: ObjectId('123'), 
    profileId: ObjectId('456'), 
    profile: { 
     grades: [ 
     ObjectId('...'), 
     ObjectId('...') 
     ] 
     // ... other props 
    } 
    } 
    // ...other documents 
] 

現在我加入了$lookup擴大管道來填充每個profile文檔裏面的等級:

MyModel.aggregate([ 
    { 
    $lookup: { 
     from: 'profiles', 
     localField: 'profileId', 
     foreignField: '_id', 
     as: 'profile' 
    } 
    }, 
    { 
    $project: { 
     profile: { 
     $arrayElemAt: [ '$profile', 0 ] 
     }, 
     profileId: 1, 
    } 
    }, 
    { 
    $lookup: { 
     from: 'profile-grades', 
     localField: 'profile._id', 
     foreignField: 'profile', 
     as: 'profile.grades' 
    } 
    } 
] 

這也是迄今爲止的結果:

[ 
    { 
    _id: ObjectId('123'), 
    profileId: ObjectId('456'), 
    profile: { 
     grades: [ 
     { 
      studyLocationId: ObjectId('789'), 
      // ... other props 
     }, 
     // ... other grades 
     ] 
    } 
    } 
    // ...other documents 
] 

,我是不能夠的最後一步實現grades陣列內每個studyLocation的人口。

通緝的結果:

{ 
    $lookup: { 
     from: 'study-locations', 
     localField: 'profile.grades.studyLocationId', 
     foreignField: '_id', 
     as: 'profile.grades.studyLocation' 
    } 
    } 

這種簡單的返回:

grades: { 
    studyLocation: [] 
} 

我應該怎麼辦呢

[ 
    { 
    _id: ObjectId('123'), 
    profileId: ObjectId('456'), 
    profile: { 
     grades: [ 
     { 
      studyLocationId: ObjectId('789'), 
      studyLocation: { 
      _id: ObjectId('...'), 
      // other props 
      }, 
     }, 
     // ... other grades 
     ] 
    } 
    } 
    // ... 
] 

我已經通過添加另一個$lookup階段,但沒有運氣嘗試?這甚至有可能嗎? 謝謝!

回答

1

如果您使用的是mongodb3.4,這將起作用,對於以前的版本,您需要在等級上展開運算符。

+0

對不起,我忘了指定它:我正在使用v3.4.5。 – Alerosa

+0

然後你必須在「profile.grades」上使用「$ unwind」來使用「$ lookup」 – Shubham