2014-03-02 58 views
1

我對MongoDb相當陌生,我試圖讓我的腦袋圍繞分組/計數函數。我想檢索每個曲目ID的選票列表,並按他們的投票排序。你能幫我理解這個嗎?MongoDB - 密鑰計數和組

列表模式:

{ 
    "title" : "Bit of everything", 
    "tracks" : [ 
     ObjectId("5310af6518668c271d52aa8d"), 
     ObjectId("53122ffdc974dd3c48c4b74e"), 
     ObjectId("53123045c974dd3c48c4b74f"), 
     ObjectId("5312309cc974dd3c48c4b750") 
    ], 
    "votes" : [ 
     { 
      "track_id" : "5310af6518668c271d52aa8d", 
      "user_id" : "5312551c92d49d6119481c88" 
     }, 
     { 
      "track_id" : "53122ffdc974dd3c48c4b74e", 
      "user_id" : "5310f488000e4aa02abcec8e" 
     }, 
     { 
      "track_id" : "53123045c974dd3c48c4b74f", 
      "user_id" : "5312551c92d49d6119481c88" 
     } 
    ] 
} 

我期待產生以下結果(按得票多少排序的理想,也非常包括那些票數組中沒有條目,使用軌道作爲參考。 ):

[ 
{ 
    track_id: 5310af6518668c271d52aa8d, 
    track_votes: 1 
}, 
{ 
    track_id: 5312309cc974dd3c48c4b750, 
    track_votes: 0 
} 
... 
] 

在MySQL中,我將執行以下

SELECT COUNT(*) AS track_votes, track_id FROM list_votes GROUP BY track_id ORDER BY track_votes DESC 

我一直在研究各種聚合/縮減功能的文檔,但我似乎無法爲我的特定情況獲得任何工作。

任何人都可以幫助我開始使用此查詢嗎?一旦我知道這些結構如何構建,我就可以在其他地方應用這些知識!

我在Ubuntu 12上使用mongodb版本2.0.4,所以我不認爲我有權訪問更高版本中提供的聚合函數。如果這是普遍的共識,那麼願意升級。

非常感謝提前!

回答

1

,我建議你到你的MongoDB版本升級到2.2,並使用Aggregation Framework如下:

db.collection.aggregate(
    { $unwind:"$votes"}, 
    { $group : { _id : "$votes.track_id", number : { $sum : 1 } } } 
) 

的MongoDB 2.2引入了一個新的聚合框架,仿照的數據處理管道的概念。文檔輸入一個多級流水線,將文檔轉換爲彙總結果。

輸出將是這樣的:

{ 
    "result":[ 
     { 
      "_id" : "5310af6518668c271d52aa8d", <- ObjectId 
      "number" : 2 
     }, 
     ... 

    ], 
    "ok" : 1 
} 

如果這是不可能的升級,我建議以編程的方式這樣做。

+0

非常感謝,幫助了很多:) – freshnode