2015-02-10 29 views
8

Mam kolekcję mongodb z wieloma polami. Jedno pole to "date_time", które jest zapisane w formacie datetime ISO, Ex: ISODate("2014-06-11T19:16:46Z"), a innym polem jest "name".Znajdź najstarszy/najmłodszy post w kolekcji mongodów

Jeśli chodzi o numer name, w jaki sposób mogę znaleźć najstarszy/najmłodszy post w kolekcji?

Ex: Jeśli istnieją two stanowisk w kolekcji „dane”:

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

Biorąc pod nazwą „Jan” w jaki sposób mogę się dowiedzieć, najstarszy wpis w kolekcji to jest jednym z ISODate("2014-06-11T19:16:46Z")? Podobnie dla najmłodszego posta.

Odpowiedz

13

Starsze:

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

Najnowszy:

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

Index na { "name" : 1, "date_time" : 1 } dokonać kwerendy wydajne.

+0

Jak zaimplementować to w Pythonie? Mój kod stwierdza db [kolekcja] .find ({"nazwa": nazwa}). Sort ({"date_time": 1}). Limit (1), ale pojawia się ten błąd: TypeError: jeśli nie określono kierunku, key_or_list musi być instancją listy – user3799658

+0

W Pythonie, jest to 'db.posts.find ({" name ":" John "}). sort ('date_time', pymongo.DESCENDING) .limit (1)' dla najnowszego. –

2

Można je agregować jak poniżej:

  • Załóż index na polach name i date_time, tak że operacje etapie $match i $sort może go używać.

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

  • $match wszystkie rekordy dla pożądanej name(s).

  • $sort przez date_time w porządku rosnącym.
  • $group przez pole name. Użyj operatora $first, aby uzyskać pierwszy rekord grupy, który również będzie najstarszy. Użyj operatora $last , aby uzyskać ostatni rekord w grupie, który będzie również najnowszym numerem . Aby uzyskać cały rekord, należy użyć zmiennej systemowej .

Kod:

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") 
     } 
}