2014-03-31 79 views
1

我有這種情況。我收集了發佈的消息。消息可以共享(如在Facebook上)。每次共享消息時,都會創建一個新消息,其中包含共享哪條消息的信息,哪條消息是原始消息,並且內容可能會被更改。一個單一的文件看起來是這樣的:MongoDB組+排序不起作用

{ 
    "_id": <id> 
    "source": <source_id> // if it's original, own id is used 
    "shared_from": <message_id> 
    "trending": 4, 
    "created": <Datetime> 
} 

trending場告訴我的消息的「質量」。

現在,這裏是問題 - 我需要獲得一些最好的消息。我也需要他們來源獨一無二。以下是我想出了,它應該工作(但事實並非如此)

db.Messages.aggregate({ 
    { $sort: { trending: -1 } }, 
    { $group: { _id: "$source", doc_id: { $first: "$_id" } } }, 
    { $project: { _id: "$doc_id" } }, 
    { $limit: 6 } 
}) 

當我這樣做,我得到徹底搞砸了結果。它根本沒有排序。這只是隨機的。我錯過了什麼?

回答

3

你得到的結果沒有排序,因爲你沒有在$group階段後排序。您已通過趨勢分類,並在分組時確保只保留每種類型的_id價值,並獲得最高的趨勢分數。但是不能保證$group最終會保留任何特定的訂單,因此您應該再次進行排序,因此您需要保持趨勢分數(假設您打算通過趨勢分數下降來保持訂單的價值)

這樣的事情將工作:

db.Messages.aggregate({ 
    { $sort: { trending: -1 } }, 
    { $group: { _id:"$source", doc_id:{$first: "$_id"}, trend:{$first:"$trending"}}}, 
    { $sort:{trend:-1} }, 
    { $project: { _id: "$doc_id" } }, 
    { $limit: 6 } 
}) 
+0

大聲笑我不會想到這一點,thanx :) –