2016-09-22 5 views
0

私は集計したいコレクションを持っています。特定のフィールドを別にするだけでなく、その集計結果に他のフィールドデータを追加します。以下は、私はこのいくつかのデータをmongodbの別のクエリに追加する

{ "position": 0, "title": "01. Ain't No Time.mp3", "url": "/published/music/tr157d6bc99e4b014fc13cf9579_.aac" }, 
{ "position": 1, "title": "02. In Her Mouth.mp3", "url": "/published/music/tr257d6bc99e4b014fc13cf9579_.aac" }, 
{ "position": 2, "title": "03. Maybach.mp3", "url": "/published/music/tr357d6bc99e4b014fc13cf9579_.aac" }, 
{ "position": 0, "title": "partysong.mp3", "url": "/published/music/tr114d6bc99ebc942fc13cf9579_.aac" }, 
{ "position": 1, "title": "outside", "url": "/published/music/tr214d6bc99ebc942fc13cf9579_.aac" } 

を取得し、これは私がすべてのmappedTracksを収集するために別々のクエリ(db.published.distinct(「mappedTracksを」))を使用私のコレクション

{ 
     "_id": ObjectId("57d6bc99e4b014fc13cf9579"), 
     "_class": "hbservlet.FinalSubmissions", 
     "active": true, 
     "mappedTracks": 
     [ 
      { "position": 0, "title": "01. Ain't No Time.mp3", "url": "/published/music/tr157d6bc99e4b014fc13cf9579_.aac" }, 
      { "position": 1, "title": "02. In Her Mouth.mp3", "url": "/published/music/tr257d6bc99e4b014fc13cf9579_.aac" }, 
      { "position": 2, "title": "03. Maybach.mp3", "url": "/published/music/tr357d6bc99e4b014fc13cf9579_.aac" } 
     ], 
     "createdBy": ObjectId("57d6bb99b17ee01a5427af08"), 
     "userId": ObjectId("57d6bb99b17ee01a5427af08"), 
     "artistname": "test", 
    }, { 
     "_id": ObjectId("14d6bc99ebc942fc13cf9579"), 
     "_class": "hbservlet.FinalSubmissions", 
     "active": false, 
     "mappedTracks": [ 
      { "position": 0, "title": "partysong.mp3", "url": "/published/music/tr114d6bc99ebc942fc13cf9579_.aac" }, 
      { "position": 1, "title": "outside", "url": "/published/music/tr214d6bc99ebc942fc13cf9579_.aac" },], 
     "createdBy": ObjectId("57d6bb99b17ee01a5427af08"), 
     "userId": ObjectId("57d6bb99b17ee01a5427af08"), 
     "artistname": "mynameismyname", 
    } 

の一例です結果私は欲しいですが、私はまた、_id、userID、それが属しているドキュメントのアーティスト名を作成された新しいオブジェクトに追加したいと思います。

答えて

0

MongoDB aggregationオペレータ$unwind$groupを試すことができます。例:

db.collection.aggregate([ 
      {$unwind:"$mappedTracks"}, 
      {$group:{_id: 
         {mappedTracks:"$mappedTracks", 
         id:"$_id", 
         userId:"$userId", 
         artistname:"$artistname" 
         } 
        } 
      } 
]) 

ここでは、これらの4つのフィールドすべての異なる値の組み合わせが望ましいとします。 mappedTracksで区別したい場合は、userIdartistnameの重複値をどうするかを決める必要があります。このような場合は、$firstオペレータを参照して重複した場合の最初の値を使用してください。

$groupの後にいくつかのフィールドの名前を変更する場合は、集計演算子$projectも参照してください。

このクエリは、ご使用のケースで頻繁に使用されるクエリであれば、Data Modelling or Document Structureを再考することをおすすめします。

+0

ありがとうございました、これは正しい方向に私を指摘しました。私はより効率的なシステムのために私の文書構造を再考しています。 –

関連する問題