2016-09-28 4 views
1

ich folgende Dokumentstruktur habe:

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

Jetzt möchte ich eine $lookup in der Videosammlung zu tun, alle Video-Daten zu erhalten. Am Ende, ich brauche eine Datenstruktur wie folgt aus:

{ 
    _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}]}] 
} 

Ist dies möglich mit MongoDB 3.2 und dem $lookup Aggregat?

+0

Nein, es gibt kein Beispiel für https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/. Ich muss den "as" Parameter also jedem einzelnen Objekt zuweisen. Sie ordnen es dem Hauptdokument zu. – user2891491

Antwort

2

Sie können es mit so etwas wie dies in MongoDB 3.2 die Sammlung unter der Annahme, dass die Details hat, ist video.details und das Feld, das Sie links-Beitritt an ist _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" 
      } 
     } 
     } 
    } 
] 

Also im Grunde Sie Ihre Lookup tun, aber Später in einer $ Group-Phase bauen Sie die Ausgabe so auf, wie Sie es möchten. Wenn Sie MongoDB 3.3.4 oder höher verwenden, benötigen Sie möglicherweise nicht die erste $ unwind-Stufe (davor war das Suchen nach Arrays nicht erlaubt).

Verwandte Themen