2014-05-16 13 views
1

我有一个用于错误跟踪的mongo数据库。它包含了2个集:在做MongoDB中的GROUP BY之前排序

项目

{ 
    "_id": 1, 
    "name": "My Project" 
} 

错误

{ 
    "_id": 1, 
    "project": 1, 
    "title": "we have a bug", 
    "timestamp": 1400215183000 
} 

在仪表板,我要显示的每个项目的最新的错误 - 高达总量的10。 因此,基本上,当做GROUP BY"project"字段,我需要确保它总是会选择等最新的错误(通过预先排序"timestamp")。

我不知道如何将排序和分组结合在一起,谢谢。

回答

2

为了让每个项目的“最新的”漏洞,同时限制对10分的结果:

db.collection.aggregate({ 
    { "$sort": { "timestamp": -1, "project": 1 } }, 
    { "$group": { 
     "_id": "$project", 
     "bug": { 
      "$first": { 
       "_id": "$_id", 
       "title": "$title", 
       "timestamp": "$timestamp" 
      } 
     } 
    }}, 
    { "$limit": 10 } 
}) 

所以排序是由时间戳和项目完成的(如优化),那么你做的$group$limit。这里的分组只是使用$first来查看“边界”,并且只是返回您可能需要或可能不需要的所有其他文档。

尝试首先使用$match实际限制您的“时间戳”范围,以优化此操作。