2012-01-12 20 views
110

ho un dato come questo in MongoDBinterrogazione ritorno in base alla data

{ "latitude" : "", "longitude" : "", "course" : "", "battery" : "0", "imei" : "0", "altitude" : "F:3.82V", "mcc" : "07", "mnc" : "007B", "lac" : "2A83", "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), "createdAt" : ISODate("2012-01-12T20:15:31Z") } 

Come interrogare db.gpsdatas.find({'createdAt': ??what here??}) in modo che mi restituisce il risultato di cui sopra da db?

risposta

237

Probabilmente si desidera fare una query gamma, per esempio, tutti gli oggetti creati dopo una certa data:

db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }}); 

sto usando $gte (maggiore o uguale), perché questo è spesso usato per la data -solo query, dove il componente orario è 00:00:00.

Se davvero si vuole trovare una data che è uguale a un'altra data, la sintassi sarebbe

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") }); 
+0

errore di ricezione: ISODate non è definito. – coure2011

+0

quale versione stai usando? – mnemosyn

+0

node.js è v0.4.8 – coure2011

12

se si vuole ottenere oggetti da nessuna parte in quella data è necessario confrontare due date

Puoi crea due date diverse dalla prima in questo modo, per ottenere l'inizio della giornata e la fine della giornata.

var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z") 

startDate.setSeconds(0); 
startDate.setHours(0); 
startDate.setMinutes(0); 

var dateMidnight = new Date(startDate); 
dateMidnight.setHours(23); 
dateMidnight.setMinutes(59); 
dateMidnight.setSeconds(59); 

### MONGO QUERY 

var query = { 
     inserted_at: { 
        $gt:morning, 
        $lt:dateScrapedMidnight 
     } 
}; 

//MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT) 
//MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT) 
8

stato appena attuare qualcosa di simile in Mongo V3.2.3 utilizzando Nodo v0.12.7 e v4.4.4 e usati:

{ $gte: new Date(dateVar).toISOString() } 

sto passando in un isodate (ad esempio 2016-04-22T00 : 00: 00Z) e funziona per una query .find() con o senza la funzione toISOString. Ma quando si utilizza in una query di corrispondenza .aggregate() $ non piace la funzione toISOString!

3

Si può anche provare "dateProp": {$gt: new Date('06/15/2016').getTime() }

5

Se si desidera ottenere tutte le cose nuove negli ultimi 5 minuti che avrebbe dovuto fare alcuni calcoli, ma la sua non è difficile ...

Innanzitutto creare un indice sulla proprietà che si desidera far corrispondere il (includere sorta direzione -1 per discendente e 1 per ascendente)

db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt 

quindi eseguire una query per i documenti creati negli ultimi 5 minuti (60 secondi * 5 minuti) .... perchè javascript's .getTime() restituisce i millisecondi necessari per moltiplicare per 1000 prima di utilizzarlo come input per il costruttore new Date().

db.things.find({ 
     createdAt: { 
      $gte: new Date(new Date().getTime()-60*5*1000).toISOString() 
     } 
    }) 
    .count() 

Spiegazione per new Date(new Date().getTime()-60*5*1000).toISOString() è la seguente:

Prima calcoliamo "5 minuti fa":

  1. new Date().getTime() ci dà il tempo corrente in millisecondi
  2. Vogliamo sottrarre 5 minuti (in ms) da quello: 5*60*1000 - Mi limito a moltiplicare per 60 secondi, quindi è facile da modificare. Posso solo cambiare 5 a 120 se voglio 2 ore (120 minuti).
  3. new Date().getTime()-60*5*1000 ci dà 1484383878676 (5 minuti fa in ms)

Ora abbiamo bisogno per alimentare che in un costruttore new Date() per ottenere il formato di stringa ISO richiesto dal timestamp MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (MongoDB .find() query)
  2. Dal momento che non siamo in grado di avere variabili lo facciamo tutto in un solo colpo: new Date(new Date().getTime()-60*5*1000)
  3. ... poi convertire in stringa ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() noi 2017-01-14T08:53:17.586Z

Naturalmente dà questo è un po 'più facile con le variabili, se si sta utilizzando il driver nodo MongoDB-native, ma questo funziona nel mon go shell che è quello che di solito uso per controllare le cose.

+0

Penso che tu possa usare 'Date.now()' invece di 'new Date(). getTime()' –

Problemi correlati