2017-10-17 19 views
3

からキーを使用してソート:

プレイリストコレクション:

{ 
    _id:123, 
    artistId:959789, 
    title:'playlist1', 
    tracks:[{trackId:123456,createdDate:03.02.2017}, 
     {trackId:213556,createdDate:04.02.2017}, 
     {trackId:956125,createdDate:05.02.2017}] 
}, 
{ 
    _id:456, 
    artistId:456456, 
    title:'playlist2', 
    tracks:[{trackId:956336,createdDate:03.02.2017}, 
     {trackId:213556,createdDate:09.02.2017}, 
     {trackId:785556,createdDate:011.02.2017}] 
}, 
{ 
    _id:456, 
    artistId:456456, 
    title:'playlist3', 
    tracks:[{trackId:636985,createdDate:01.02.2017}, 
     {trackId:456585,createdDate:06.02.2017}, 
     {trackId:785556,createdDate:09.02.2017}] 
} 

プレイリストのトラック配列のtrackIdは、トラックの_idですトラックコレクション

トラックコレクション:

{_id:956336,title:'abc'}, 
{_id:785556,title:'cdf'}, 
{_id:456585,title:'ghi'}, 
{_id:213556,title:'xyz'}, 
{_id:636985,title:'lmn'} 

私がしたのは、tracks配列のtrackIdを使用した集計$lookupでした。結果が見つかりました。しかし、playlistTracksは、tracksの配列順ではなく、他の順序で並べ替えられました。 playlistTrackstracks配列にcreatedDateに順にソートする必要があります。

{ 
     $match: {artistId: 456} 
}, 
{ 
    $lookup: { 
      from: 'tracks', 
      localField: 'tracks.trackId', 
      foreignField: '_id', 
      as: 'playlistTracks' 
     } 
}, 

は今、私は必要なものは以下の構造を有する特定のアーティストのプレイリストの一覧を取得することです。

{ 
    _id:456, 
    title:'playlist2', 
    tracks:[{trackId:636985,createdDate:01.02.2017}, 
     {trackId:456585,createdDate:06.02.2017}, 
     {trackId:785556,createdDate:09.02.2017}] 
    playlistTracks:[{_id:956336,title:'abc'}, 
      {_id:213556,title:'xyz'}, 
      {_id:785556,title:'cdf'}] 
}, 
{ 
    _id:456, 
    title:'playlist2', 
    tracks:[{trackId:636985,createdDate:01.02.2017}, 
     {trackId:456585,createdDate:06.02.2017}, 
     {trackId:785556,createdDate:09.02.2017}] 
    playlistTracks:[{_id:636985,title:'lmn'}, 
      {_id:456585,title:'ghi'}, 
      {_id:785556,title:'cdf'}] 
} 

答えて

1

フォロー

1 unwind the tracks array in playlist collection 
2 $lookup match with tracks collection 
3 add createddate of tracks array to lookup result as a new key 
4 sort based on new key 
5 group the results for your requirements 
+0

ありがとうございました。これは動作します!!!! –

1

したがって、これらは、私はあなたのユースケースを再現するために、追加のドキュメントです:

プレイリスト収集

{ 
    "_id" : NumberInt(123), 
    "artistId" : NumberInt(959789), 
    "title" : "playlist1", 
    "tracks" : [ 
     { 
      "trackId" : NumberInt(123456), 
      "createdDate" : "03.02.2017" 
     }, 
     { 
      "trackId" : NumberInt(213556), 
      "createdDate" : "04.02.2017" 
     }, 
     { 
      "trackId" : NumberInt(956125), 
      "createdDate" : "05.02.2017" 
     } 
    ] 
} 
{ 
    "_id" : NumberInt(456), 
    "artistId" : NumberInt(456456), 
    "title" : "playlist2", 
    "tracks" : [ 
     { 
      "trackId" : NumberInt(956336), 
      "createdDate" : "03.02.2017" 
     }, 
     { 
      "trackId" : NumberInt(213556), 
      "createdDate" : "09.02.2017" 
     }, 
     { 
      "trackId" : NumberInt(785556), 
      "createdDate" : "11.02.2017" 
     } 
    ] 
} 
{ 
    "_id" : NumberInt(457), 
    "artistId" : NumberInt(456456), 
    "title" : "playlist3", 
    "tracks" : [ 
     { 
      "trackId" : NumberInt(636985), 
      "createdDate" : "01.02.2017" 
     }, 
     { 
      "trackId" : NumberInt(456585), 
      "createdDate" : "06.02.2017" 
     }, 
     { 
      "trackId" : NumberInt(785556), 
      "createdDate" : "09.02.2017" 
     } 
    ] 
} 

を私は_idでプレイリストのコレクションの最後の重複_idを変更:457私はあなたが同じ_idの2つの文書をどのように持つことができるかわかりません。 _idフィールドは一意でなければなりません。 $matchあなたの質問には、$match: {artistId: 456}がありますが、あなたのデータには、のartiseIdとが含まれていませんので、あなたの希望する結果が正しいと分かりません。

と、この日付

{trackId:785556、CreatedDateに:011.02.2017} 456 ID_文書から

日は奇妙に見えた原因私は

{trackId:785556,createdDate:"11.02.2017"} 

に変更。日付フィールドが文字列であるように見えますが、確かに日付フィールドのようには見えません。どちらの方法でも、$sortは両方の用途に有効です。

トラックコレクション私はあなたの例のように去った。

これはあなたが必要と思われるものですか?

db.playlist.aggregate([ 
{ 
     $match: {_id: {$in: [456]}} 
}, 
{ $unwind: "$tracks"}, 
{$sort: {"tracks.createdDate": 1}}, 
{ 
    $lookup: { 
      from: 'tracks', 
      localField: 'tracks.trackId', 
      foreignField: '_id', 
      as: 'playlistTracks' 
     } 
}, 
{ 
    $group:{ 
     _id: "$_id", 
     artistId: {$first: "$artistId"}, 
     title: {$first: "$title"}, 
     tracks: { $push: { item: "$tracks.trackId", quantity: "$tracks.createdDate" } }, 
     playlistTracks: { $push: "$playlistTracks" } 
    } 
} 
]) 

これは、両方の配列を同じ順序に置きます。昇順または降順にする場合は、{$sort: {"tracks.createdDate": 1}}を指定できます-1オーダー

したがって、フィールドを検索する前に、プレイリストの配列を並べ替えることができます。これは以下の

+0

ステップ働く 希望は実際に私が 'createdDate'を使用してソートする' $のlookup'の結果が欲しいです。このように '$ unwind'と' $ sort'を使うと 'tracks'配列がソートされます。 –

+0

申し訳ありませんが私はあなたの質問を誤解、私は私の答えを更新します。 –

+0

努力してくれてありがとうございました。私はそれを試してみました。しかし、私は結果が欲しい方法を働いていません –

関連する問題