Mongodb聚合框架和嵌套的$ lookup

时间:2017-08-25 10:46:32

标签: mongodb aggregation-framework database

我正在尝试使用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 文档中的成绩:

&#xA;&#xA;
  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;
  [&#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;&#xA;
  {&#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;

1 个答案:

答案 0 :(得分:1)

如果您使用的是mongodb3.4,这将有效,对于以前的版本,您需要在成绩上展开运算符。