2016-05-16 71 views
1

我在集合中有以下數據。組,然後在MongoDB中展開記錄

> db.person.find().pretty() 
{ 
     "_id" : ObjectId("573a30a9dcf15c037f943f27"), 
     "name" : "Mark", 
     "age" : 30, 
     "country" : "US" 
} 
{ 
     "_id" : ObjectId("573a30b9dcf15c037f943f28"), 
     "name" : "John", 
     "age" : 34, 
     "country" : "FR" 
} 
{ 
     "_id" : ObjectId("573a30d1dcf15c037f943f29"), 
     "name" : "Rodrigo", 
     "age" : 23, 
     "country" : "IT" 
} 
{ 
     "_id" : ObjectId("573a3194dcf15c037f943f2a"), 
     "name" : "Steve", 
     "age" : 23, 
     "country" : "US" 
} 

我想找出在每個國家的最年長的人的文件。例如,以下數據應該是上述數據的結果。

{ 
     "_id" : ObjectId("573a30a9dcf15c037f943f27"), 
     "name" : "Mark", 
     "age" : 30, 
     "country" : "US" 
} 
{ 
     "_id" : ObjectId("573a30b9dcf15c037f943f28"), 
     "name" : "John", 
     "age" : 34, 
     "country" : "FR" 
} 
{ 
     "_id" : ObjectId("573a30d1dcf15c037f943f29"), 
     "name" : "Robert", 
     "age" : 23, 
     "country" : "IT" 
} 

我已經嘗試過聚合,但它沒有幫助。實際上Mongo DB中可以做這種操作嗎?如果是,請分享解決方案。

+0

這可能有所幫助:http://stackoverflow.com/questions/10612660/select-max-with-group-by-in-mongodb – ggallo

+0

如果兩個文檔具有相同的「年齡」值,您希望做什麼?對應於他們的「國家」的最大值? – styvane

回答

2

你實際上可以做到這一點,如果我理解你是對的。你試圖做的是按國家分組並挑選最高年齡。

像這樣的東西可能會奏效:

db.person.aggregate([ 
    {$sort: {country: 1, age: 1}}, 
    {$group: 
     {_id: "$country", 
     doc_id: {$last: "$_id"}, 
     age: {$last: "$age"}, 
     name: {$last: "$name"}} 
    } 
]) 

這會給你在每個最高,具有文件對應國家的ID,以及包括原始文檔的所有信息。您可以在組之後添加任何您想要的流水線,例如,如果要重塑文檔以具有不同的屬性名稱。

相關問題