2013-05-30 41 views
0

我正在使用MongoDB聚合框架嘗試從我們的數據集中收集一些總數。Mongo聚合並將子對象分隔爲單獨的文檔

這裏是源數據的一個例子:

{ 
    "urn": "urn:content:epi:0001", 
    "duration": 3450272, 
    "profiles": { 
     "low": { 
      "mp3": { 
       "size": 8623059425, 
       "url": "0001_low.mp3" 
      }, 
      "oga": { 
       "size": 8623059425, 
       "url": "0001_low.oga" 
      }, 
      "m4a": { 
       "size": 8623059425, 
       "url": "0001_low.m4a" 
      } 
     }, 
     "medium": { 
      "mp3": { 
       "size": 8623059425, 
       "url": "0001_medium.mp3" 
      }, 
      "oga": { 
       "size": 8623059425, 
       "url": "0001_medium.oga" 
      }, 
      "m4a": { 
       "size": 8623059425, 
       "url": "0001_medium.m4a" 
      } 
     }, 
     "high": { 
      "mp3": { 
       "size": 8623059425, 
       "url": "0001_high.mp3" 
      }, 
      "oga": { 
       "size": 8623059425, 
       "url": "0001_high.oga" 
      }, 
      "m4a": { 
       "size": 8623059425, 
       "url": "0001_high.m4a" 
      } 
     } 
    } 
} 

什麼我希望做的是單獨的每個profile.(low|medium|high).(mp3|oga|m4a)成聚集一個單獨的文件/項目,因此,例如:

{ 
    "_id": null, 
    "files": [ 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_low.mp3" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_low.oga" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_low.m4a" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_medium.mp3" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_medium.oga" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_medium.m4a" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_high.mp3" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_high.oga" 
     }, 
     { 
      "urn": "urn:content:epi:0001", 
      "duration": 3450272, 
      "size": 8623059425, 
      "url": "0001_high.m4a" 
     } 
    ] 
} 

這種事情可能使用聚合框架,或者這是MapReduce上可以做到的事情嗎?

+0

你有什麼試過?如果結構使用像'fileType:「mp3」'而不是'low:{「mp3」:...}}'的特定屬性的數組,那麼實現使用AF會簡單很多。 – WiredPrairie

+0

而且,根據你使用數據的方式,在客戶端處理你想要的結構(可能效率很高)很容易。 – WiredPrairie

+0

不幸的是,我無法改變結構,因爲它已經被系統的多個領域廣泛使用。 我同意也許將一些邏輯留給客戶端,而不是試圖在聚合步驟中完成所有這些,可能是要走的路,實際上我現在已經實現了。 我只是想知道在聚合步驟中是否完全可以做到這一點:) – chillievodka

回答

0

不,彙總框架的$unwind階段是將單個集合文檔轉換爲多個管道文檔的唯一方法,而$unwind僅適用於數組,而不適用於您的子文檔。

相關問題