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: []
}
私はそれをどのように行う必要があります?これも可能ですか? ありがとうございました!
申し訳ありませんが、指定するのを忘れていました。私はv3.4.5を使用しています。 – Alerosa
次に、 "$ lookup"を使用するには "profile.grades"に "$ unwind"を使用する必要があります。 – Shubham