2016-08-23 37 views
0

我想編寫一個查詢,查找具有最高值的文檔。有多個具有相同值的文檔,我想要所有這些文檔。僅檢索具有最高值的文檔

我知道我可以使用排序從高到低排序。但我不知道有多少文件。所以這是行不通的。

{ 
    total: 1, 
    id: 1 
}, 
{ 
    total: 1, 
    id: 2 
}, 
{ 
    total: 2, 
    id: 3 
}, 
{ 
    total: 2, 
    id: 4 
}, 
{ 
    total: 3, 
    id: 5 
}, 
{ 
    total: 3, 
    id: 6 
} 

在這個例子中,我希望它返回共有3的所有文件。 如何查詢具有最高價值的所有文檔?

+0

[檢索與數組中最大值匹配的子文檔]可能的重複(http://stackoverflow.com/questions/37594665/retrieve-sub-documents-that-match-with-maximum-value-in數組) – styvane

+0

更好的答案在這裏。 [我如何獲得MongoDB集合中的最低值?](http://stackoverflow.com/a/37504155/3100115) – styvane

回答

-2

你可以做這樣的事情

var a = db.tot.find().sort({"total":-1}); 
var maxTotal = 0; 
while (a.hasNext()) { 

    var doc1 = a.next(); 

     if (doc1.total>=maxTotal) { 
      maxTotal = doc1.total; 
     }else { 
      break; 
     } 
    db.doc2.insert(doc1); 

} 

現在你都在收集DOC2最高值的文件

+0

爲什麼負面評級?你甚至運行過代碼嗎?我嘗試在我的本地和它的作品.. – user641887

+0

嘿,我沒有downvote你。謝謝您的回答! – nomasusuarios

-1

這會爲你工作:

db.yourcollectionname.aggregate([ 
    { 
     $group:{ 
      _id: null, 
      high_val: {$max:"$total"} 
     } 
    }, 
    { 
     $lookup:{ 
      from: "yourcollectionname", 
      localField: "high_val", 
      foreignField: "total", 
      as: "elements" 
     } 
    }, 
    { 
     $unwind: "$elements" 
    }, 
    { 
     $project:{ 
      _id:false, 
      id: "$elements.id", 
      total: "$elements.total" 
     } 
    } 
]); 

這裏$查找用於獲取從最初的$ group檢索到的最大值,並且appl它返回到同一張表來檢索匹配的記錄。

我確定有更好的方法來做到這一點,但我無法抗拒,因爲我剛開始使用$查找,所以只是探索它可以做什麼。