2015-02-10 25 views
8

Ho una raccolta mongodb con molti campi. Un campo è 'date_time', che si trova in un formato data/ora ISO, Es: ISODate("2014-06-11T19:16:46Z") e un altro campo è 'nome'.Trova post più vecchio/più recente nella collezione mongodb

Dato un name, come si trova il post più vecchio/più recente della raccolta?

Es: Se ci sono two messaggi nella raccolta 'dei dati':

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

Dato il nome 'John' come faccio a scoprire il più vecchio posto nella collezione vale a dire, quello con ISODate("2014-06-11T19:16:46Z")? Allo stesso modo per il post più giovane.

risposta

13

maggiore:

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

più nuovi:

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

Index sul { "name" : 1, "date_time" : 1 } per rendere le query efficiente.

+0

Come faccio a implementare questo in Python? Il mio codice afferma db [collection] .find ({"name": name}). Sort ({"date_time": 1}). Limit (1) ma ottengo questo errore: TypeError: se non viene specificata alcuna direzione, key_or_list deve essere un'istanza della lista – user3799658

+0

In Python, è 'db.posts.find ({" name ":" John "}). sort ('date_time', pymongo.DESCENDING) .limit (1)' per il più recente. –

2

Si potrebbe aggregare come qui sotto:

  • Creare un index sui campi name e date_time, in modo che le operazioni di $match e $sort fase possono servirsene.

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

  • $match tutti i record per il name(s) desiderato.

  • $sort di date_time in ordine crescente.
  • $group dal campo name. Utilizzare l'operatore $first per ottenere il primo record del gruppo, che sarà anche il più vecchio. Utilizzare l'operatore $last per ottenere l'ultimo record nel gruppo, che sarà anche il più recente.
  • Per ottenere l'intero record utilizzare la variabile di sistema $$ROOT.

Codice:

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