mongodb如何获得每个“具有相同键的组”的最大值

时间:2016-11-25 11:46:09

标签: python mongodb mongodb-query aggregation-framework

我有一个集合:

{'name':'ada','updateTime':'2016-11-25'}
{'name':'bob','updateTime':'2016-11-25'}
{'name':'ada','updateTime':'2016-11-20'}
{'name':'bob','updateTime':'2016-11-20'}
{'name':'ada','updateTime':'2016-11-15'}
{'name':'bob','updateTime':'2016-11-15'}
...

如果我想要的结果是,'updateTime'的最大值是相同的'name':

{'name':'ada','updateTime':'2016-11-25'}
{'name':'bob','updateTime':'2016-11-25'}
...

或最终得到一个python dict:

{'ada':'2016-11-25','bob':'2016-11-25',...}

如何最有效?

我现在在python中这样做:

for name in db.collection.distinct('name'):
    result[name]=db.collection.find({'name':name}).sort('updateTime',-1)[0]

是否'找'过多次?

2 个答案:

答案 0 :(得分:2)

您可以在聚合的单个查询中执行此操作:

db.collection.aggregate([
   {
      $sort:{
         updateTime:-1
      }
   },
   {
      $group:{
         "_id":"$name",
         updateTime:{
            $first:"$updateTime"
         }
      }
   }
])

这将返回

{ "_id" : "bob", "updateTime" : "2016-11-25" }
{ "_id" : "ada", "updateTime" : "2016-11-25" }

在线试用:mongoplayground.net/p/QZ01RSDneyR

答案 1 :(得分:0)

MongoDB 中,可以选择使用 $ max 运算符查找最大值。

db.collection.aggregate([
   {
      $group:{
         "_id":"$name",
         updateTime:{
            $max:"$updateTime"
         }
      }
   }
])

在我的输出下面有上面的查询。

{
    "_id" : "bob",
    "updateTime" : "2016-11-25"
}
{
    "_id" : "ada",
    "updateTime" : "2016-11-25"
}