2013-12-10 39 views
2

說我有一個MongoDB的集合與文檔有關員工:MongoDB聚合:如何查詢每組有限數量的「頂級」文檔?

{ 
    name : "John Doe", 
    department : "Finance", 
    salary : 100 
} 

我如何可以查詢每個部門的最高薪水的員工X?

編輯

,只讓自己多一點明確的,這就是我想達到的效果:

db.collection.aggregate(
    {$sort : {salary : -1}}, 
    {$group : { 
     _id : "$department" 
     employees : {$addToSet : "$name"} 
    }, 
    {$project : {employees : {$slice : X}}} 
) 

但這並不原因有二:
1 。$ addToSet不保證輸出集的任何排序(至少根據documentation)。
2. $slice doesn't work in the aggregation framework

+0

我不認爲這是可能在一個單一的查詢/聚合,因爲它需要多個傳遞來解決答案(首先得到不同的部門,然後...)。 – WiredPrairie

回答

1

雖然這不是最佳性能,但您可以實現這一點,即返回集合,然後排序/接收代碼。如果你想通過命令行,像

db.collection.find({ Department : 'Sales' }).sort({Salary:-1}).limit(50) 

應該工作。

+0

我假設通過查詢整個集合並處理代碼中的數據,我可以實現任何事情(具有不同的性能)。我希望能夠在殼體中獲得最佳性能。您提供的查詢完全忽略了部門;因此,這是無關緊要的。 –

+0

該命令的格式應該正常工作 - 它不是基於獲取整個集合的想法。對不起,如果這個例子不是很好的定製: – Dave

+0

我知道。我的評論是兩點評論,很像你的回答。無論如何,您提供的查詢不會回答問題中的問題(不一定是我提供的示例)。我已經編輯了關於如何解決這個問題的想法以及爲什麼我的解決方案不起作用;這可能有助於更好地理解我的問題。 –

0

也許下面的查詢應該可以幫助你解決你的問題。

通過使用聚合查詢,您可以先對數據進行排序,然後通過使用限制來限制您想要的最高薪水的用戶數量。最後,您可以按部門對用戶進行分組。

db.test.aggregate(
    {$sort : {salary : -1}}, 
    {$limit : 5}, 
    {$group : {_id:"$department", employees : {$addToSet : "$name"}}} 
) 
+3

這將返回按部門分組的所有員工中薪水最高的X個員工。它與每個部門中薪水最高的X僱員不同(這是我正在尋找的)。 –