2016-09-28 3 views
1

Я, имеющих следующую структуру документа:

{ 
    _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 агрегатом?

+0

Нет, на этом примере нет https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/. Мне нужно назначить параметр «как», чтобы каждый отдельный объект. Они назначают его основному документу. – user2891491

ответ

2

Вы можете сделать это с чем-то вроде этого в 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" 
      } 
     } 
     } 
    } 
] 

Так в основном вы делаете свой поиск, но позже на групповом этапе создайте выход так, как вам нравится. вам может не понадобиться первый этап $ unwind, если вы используете MongoDB 3.3.4 или выше (до этого $ lookup на массивах не разрешалось).