2016-10-15 102 views
2

我有一個集合,持有競爭結果。MongoDB查詢排序與唯一

{"person" : "Adam", "time" : 10.01, "compName" : "comp A"} 
{"person" : "Bob", "time" : 10.12, "compName" : "comp B"} 
{"person" : "Adam", "time" : 9.03, "compName" : "comp C"} 
{"person" : "Adam", "time" : 10.99, "compName" : "comp D"} 
{"person" : "David", "time" : 10.05, "compName" : "comp D"} 
{"person" : "Bob", "time" : 10.78, "compName" : "comp E"} 

我想從這個集合中獲得排名。

我試過做db.results.find({}).sort({"time" : 1}),但是這給了我重複的同名結果。我怎樣才能得到每個名字的最佳時間?

回答

4

您可以使用MongoDB的aggregation $min來實現這一目標

您的查詢將會像下面

db.results.aggregate(
    {$group: {_id: '$person', besttime: {$min: "$time"}}} 
    {$sort: {besttime: 1}} 
); 

關於流星,我相信這是你要問這取決於您的問題與它一個單獨的問題。

編輯:

如果你想使用compName也爲聚合值,只需將其添加到$group哈希像

db.results.aggregate(
    {$group: {_id: '$person', "compName": { "$first": "$compName" }, besttime: {$min: "$time"}}}, 
    {$sort: {besttime: 1}} 
); 
+0

有沒有辦法讓'compName'最短時間來自? –

+0

@OrangePeel剛添加到'$ group'哈希。我用一個例子編輯了答案 –

+1

@chridam呵呵,當然,如果答案只需要一個名稱而不考慮'compName',那麼這是正確的。現在通過querstion閱讀,我相信這正是想要的......現在編輯我的答案,謝謝 –

0

您可以使用$min或低於$max根據需要,

db.results.aggregate(
    [ 
     { 
     $group : { 
      "_id": "$person", 
      "time": { "$min": "$time" }, 
      "compName": { $push: "compName" } 
     } 
     } 
    ] 
)