在对象数组中使用$ lookup

时间:2016-09-28 21:21:09

标签: mongodb mongodb-aggregation

我有以下文件结构:

{
  _id: 123,
  name: 'My playlist',
  videos:[
   {videoId:1},
   {videoId:2},
   {videoId:3}]
}

现在我想在视频集中进行$lookup以获取所有视频数据。最后,我需要一个这样的数据结构:

{
  _id: 123,
  name: 'My playlist',
  videos:[
   {videoId:1, videoDetails:[{_id:1, title:'My funny video', views:123}]},
   {videoId:2, videoDetails:[{_id:2, title:'My new video', views:1234}]},
   {videoId:3, videoDetails:[{_id:3, title:'Another video', views:1236}]}]
}

这可能与MongoDB 3.2和$lookup汇总吗?

有关

1 个答案:

答案 0 :(得分:3)

你可以在MongoDB 3.2中使用类似的东西来做这件事,假设具有详细信息的集合是video.details,而你所加入的字段是_id

[  
   {  
      $unwind:"$videos"
   },
   {  
      $lookup:{  
         from:"video.details",
         localField:"videos.videoId",
         foreignField:"_id",
         as:"details"
      }
   },
   {  
      $group:{  
         _id:"$_id",
         name:{  
            $first:"$name"
         },
         videos:{  
            $push:{  
               videoId:"$videos.videoId",
               videoDetails:"$details"
            }
         }
      }
   }
]

所以基本上你进行查找但后来在$ group阶段按照你喜欢的方式构建输出。如果您使用的是MongoDB 3.3.4或更高版本,则可能不需要第一个$ unwind阶段(不允许在数组上查找$ lookup之前)。