2015-02-10 13 views
8

Ich habe eine mongodb Sammlung mit vielen Feldern. Ein Feld ist "date_time", das sich in einem ISO-Datetime-Format befindet, zB ISODate("2014-06-11T19:16:46Z"), und ein anderes Feld ist "name".Finde älteste/jüngste Post in Mongodb Sammlung

Wie oft finde ich den ältesten/jüngsten Beitrag in der Sammlung name?

Ex:

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

Da der Name ‚John‘ Wie finde ich in der Sammlung der älteste Beitrag aus das heißt, der einen mit ISODate("2014-06-11T19:16:46Z"): Wenn es two Stellen in der Sammlung ‚Daten‘ sind? Ähnlich für den jüngsten Beitrag.

Antwort

13

Älteste:

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

Neueste:

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

Index auf { "name" : 1, "date_time" : 1 } auf die Abfragen effizienter zu machen.

+0

Wie implementiere ich dies in Python? Mein Code states db [Sammlung] .find ({"Name": Name}). Sort ({"Datum_Zeit": 1}). Limit (1), aber ich bekomme diesen Fehler: TypeError: wenn keine Richtung angegeben ist, muss key_or_list sei eine Instanz der Liste – user3799658

+0

In Python ist es 'db.posts.find ({" name ":" John "}). sort ('date_time', pymongo.DESCENDING) .limit (1)' für das Neueste. –

2

Man könnte es aggregieren wie folgt:

  • eine index erstellen, die auf name und date_time Felder, so dass die $match und $sort Bühne Operationen es verwenden kann.

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

  • $match alle Datensätze für die gewünschte name(s).

  • $sort von date_time in aufsteigender Reihenfolge.
  • $group von der name Feld. Verwenden Sie den Operator $first, um den ersten Datensatz der Gruppe zu erhalten, der auch der älteste sein wird. Verwenden Sie den Operator $last , um den letzten Datensatz in der Gruppe abzurufen, der auch der neueste Eintrag ist.
  • Um den gesamten Datensatz zu erhalten, verwenden Sie die Systemvariable $$ROOT.

Code:

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