2015-02-10 88 views
8

我有一個mongodb集合與許多領域。一個字段是'date_time',採用ISO日期時間格式,例如:ISODate("2014-06-11T19:16:46Z"),另一個字段是'name'。在mongodb集合中查找最古老/最年輕的帖子

鑑於name,如何找出收藏中最古老/最年輕的帖子?

例如:如果有two帖子收集「數據」中:

[{'name' : 'John', 'date_time' : ISODate("2014-06-11T19:16:46Z")}, 
{'name' : 'John', 'date_time' : ISODate("2015-06-11T19:16:46Z")}] 

命名爲「約翰」我怎麼找出集合即一個與ISODate("2014-06-11T19:16:46Z")中最古老的帖子?類似的最年輕的職位。

回答

13

最老:

db.posts.find({ "name" : "John" }).sort({ "date_time" : 1 }).limit(1) 

最新:上{ "name" : 1, "date_time" : 1 }

db.posts.find({ "name" : "John" }).sort({ "date_time" : -1 }).limit(1) 

指數,使查詢效率。

+0

我如何在Python實現這一點?我的代碼狀態db [collection] .find({「name」:name})。sort({「date_time」:1})。limit(1)但是我得到這個錯誤:TypeError:如果沒有指定方向,key_or_list必須是一個列表的實例 – user3799658 2015-02-12 18:16:30

+0

在Python中,它是'db.posts.find({「name」:「John」})。sort('date_time',pymongo.DESCENDING).limit(1)'爲最新的。 – 2018-02-28 16:28:55

2

你可以如下彙總它:

  • 創建的namedate_time領域的index,使 $match$sort階段的操作可以使用它。

    db.t.ensureIndex({"name":1,"date_time":1})

  • $match所有所需name(s)的記錄。

  • $sortdate_time按升序排列。
  • $groupname字段。使用$first運營商獲取該組的第一個 記錄,該記錄也是最早的。使用運算符$last 獲取組中的最後一條記錄,最新的記錄也將是 。
  • 要獲取整個記錄,請使用$$ROOT系統變量。

代碼:

db.t.aggregate([ 
{$match:{"name":"John"}}, 
{$sort:{"date_time":1}}, 
{$group:{"_id":"$name","oldest":{$first:"$$ROOT"}, 
         "youngest":{$last:"$$ROOT"}}} 
]) 

O/P:

{ 
     "_id" : "John", 
     "oldest" : { 
       "_id" : ObjectId("54da62dc7f9ac597d99c182d"), 
       "name" : "John", 
       "date_time" : ISODate("2014-06-11T19:16:46Z") 
     }, 
     "youngest" : { 
       "_id" : ObjectId("54da62dc7f9ac597d99c182e"), 
       "name" : "John", 
       "date_time" : ISODate("2015-06-11T19:16:46Z") 
     } 
}