2017-08-25 5 views
2

私はmongodbのアグリゲーションフレームワークを使用してネストされた人口を作ろうとしています。

これは私が持っている初期データですので、私はprofileIdフィールドを使用してprofileフィールドを読み込むことができ、私はそれに、この集約パイプラインを適用

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

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 
] 

は今、私は、各profile文書内の成績を移入する$lookupを追加することにより、パイプラインを展開します。

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の集団があります。

募集結果:

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

私は別の$lookupのステージを追加することではなく、運なしで試してみた:

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

これは単に返す:

grades: { 
    studyLocation: [] 
} 

私はそれをどのように行う必要があります?これも可能ですか? ありがとうございました!

答えて

1

mongodb3.4を使用している場合、これは動作しますが、以前のバージョンでは、グレードのアンワインドオペレータが必要です。

+0

申し訳ありませんが、指定するのを忘れていました。私はv3.4.5を使用しています。 – Alerosa

+0

次に、 "$ lookup"を使用するには "profile.grades"に "$ unwind"を使用する必要があります。 – Shubham

関連する問題