我正在尝试使用mongodb的聚合框架来进行嵌套填充,我遇到了一些麻烦。


这是我的初始数据:




 [
 {
 _id:ObjectId('123'),
 profileId:ObjectId('456')
 },
 // ...其他文档
]



 我将此聚合管道应用于它,以便我可以填充配置文件
字段,使用 profileId
字段:
MyModel.aggregate( [
 {
 $ lookup:{
 from:'profiles',
 localField:'profileId',
 foreignField:'_ id',
 as: '个人资料'
}
},
 {
 $ project:{
个人资料:{
 $ arrayElemAt:['$ profile',0]& #xA;},
 profileId:1,
}
},
]

&#xA;&#xA; <这就是结果:&#xA;&#xA; [&#xA; {&#xA; _id:ObjectId( '123'),&#xA; profileId:ObjectId('456'),&#xA;个人资料:{&#xA;成绩:[&#xA; ObjectId('...'),&#xA; ObjectId ('...')&#xA;]&#xA; // ...其他道具&#xA;}&#xA;}&#xA; // ...其他文件&#xA;]&#xA ; 代码>
&#XA;&#XA; 现在我通过添加 $ lookup
来扩展管道,以填充每个 profile
文档中的成绩:
MyModel.aggregate([&#xA; {&#XA; $ lookup:{&#xA;来自:'profiles',&#xA; localField:'profileId',&#xA; foreignField:'_ id',&#xA; as:'profile'&#xA; }&#XA; },&#XA; {&#XA; $ project:{&#xA;简介:{&#xA; $ arrayElemAt:['$ profile',0]&#xA; },&#XA; profileId:1,&#xA; }&#XA; },&#XA; {&#XA; $ lookup:{&#xA;来自:'profile-grades',&#xA; localField:'profile._id',&#xA; foreignField:'profile',&#xA; as:'profile.grades'&#xA; }&#XA; }&#xA;]&#xA;
&#xA;&#xA; 这是迄今为止的结果:
&#xA;&#xA; [&#xA; {&#XA; _id:ObjectId('123'),&#xA; profileId:ObjectId('456'),&#xA;简介:{&#xA;成绩:[&#xA; {&#XA; studyLocationId:ObjectId('789'),&#xA; // ...其他道具&#xA; },&#XA; // ...其他成绩&#xA; ]&#XA; }&#XA; }&#XA; // ...其他文件&#xA;]&#xA;
&#xA;&#xA; 我无法实现的最后一步是每个人口 grade
数组中的 studyLocation
。
通缉结果:
&#xA;&#xA; [&#xA; {&#XA; _id:ObjectId('123'),&#xA; profileId:ObjectId('456'),&#xA;简介:{&#xA;成绩:[&#xA; {&#XA; studyLocationId:ObjectId('789'),&#xA; studyLocation:{&#xA; _id:ObjectId('...'),&#xA; //其他道具&#xA; },&#XA; },&#XA; // ...其他成绩&#xA; ]&#XA; }&#XA; }&#XA; // ...&#xA;]&#xA;
&#xA;&#xA; 我尝试添加另一个 $ lookup
阶段但没有运气:
{&#xA; $ lookup:{&#xA;来自:'study-locations',&#xA; localField:'profile.grades.studyLocationId',&#xA; foreignField:'_ id',&#xA; as:'profile.grades.studyLocation'&#xA; }&#XA; }&#xA;
&#xA;&#xA; 这只是返回:
&#xA;&#xA; 成绩:{&#xA; studyLocation:[]&#xA;}&#xA;
&#xA;&#xA; 我该怎么办?这甚至可能吗?&#xA;谢谢!
&#xA;答案 0 :(得分:1)
如果您使用的是mongodb3.4,这将有效,对于以前的版本,您需要在成绩上展开运算符。