2012-11-02 55 views
7

使用聚合框架,獲取每個分組的字段的最大值的最佳方式是什麼,以便使用下面的集合我會喜歡具有爲具有最新日期的每個group_id返回一個文檔的功能。第二個清單顯示了所需的結果。通過字段進行彙總並選擇另一個字段的最大值作爲集合的文檔

group_id date 
1  11/1/12 
1  11/2/12 
1  11/3/12 
2  11/1/12 
3  11/2/12 
3  11/3/12 

期望的結果

group_id date 
1  11/3/12 
2  11/1/12 
3  11/3/12 
+3

[?你嘗試過什麼(http://whathaveyoutried.com) – JohnnyHK

+0

我知道這是不太你要找的,但你可以遍歷({group_id:n}).sort({date:-1}).limit(1) - 對於每個group_id = n。通過組ID,執行類似於: db.foo.find 這將按日期對給定組ID的所有文檔進行排序,然後僅返回最近的文檔。 – Louisa

回答

6

您可以使用在聚合框架的$max分組功能查找每個group_id最新的文檔。您需要額外的查詢才能根據分組標準檢索完整文檔。

var results = new Array(); 
db.groups.aggregate(
    // Find documents with latest date for each group_id 
    { $group: { 
     _id: '$group_id', 
     date: { $max: '$date' }, 
    }}, 
    // Rename _id to group_id, so can use as find criteria 
    { $project: { 
     _id: 0, 
     group_id:'$_id', 
     date: '$date' 
    }} 
).result.forEach(function(match) { 
    // Find matching documents per group and push onto results array 
    results.push(db.groups.findOne(match)); 
}); 

示例結果:

{ 
    "_id" : ObjectId("5096cfb8c24a6fd1a8b68551"), 
    "group_id" : 1, 
    "date" : ISODate("2012-11-03T00:00:00Z"), 
    "foo" : "bar" 
} 
{ 
    "_id" : ObjectId("5096cfccc24a6fd1a8b68552"), 
    "group_id" : 2, 
    "date" : ISODate("2012-11-01T00:00:00Z"), 
    "foo" : "baz" 
} 
{ 
    "_id" : ObjectId("5096cfddc24a6fd1a8b68553"), 
    "group_id" : 3, 
    "date" : ISODate("2012-11-03T00:00:00Z"), 
    "foo" : "bat" 
} 
+0

謝謝,那麼我怎樣才能得到這些作爲最大日期的整個文件?我應該在分組後進行投影並明確抓取所有的字段嗎? – user1795267

+0

分組將組合文檔,這可能不是你想要的。我已經更新了示例以使用聚合框架來查找最新的文檔'_id's和'$ in'查詢來獲取完整的文檔。 – Stennie

+2

@Stennie謝謝,這太棒了!但不應該$ max id選擇只選擇最高_id而不是$ max日期的文檔ID?訂購在這裏重要嗎? – Timothy055

相關問題