richiesta di restituzione in base alla data


210

Ho un dato come questo in mongodb

{ 
    "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 posso eseguire una query db.gpsdatas.find({'createdAt': ??what here??}), in modo che mi restituisca il risultato dei dati sopra dal db?


sarebbe stato efficace menzionare la libreria nodejs che stavi usando, ma sulla base dell'esempio sembra che sia la sua mongoosejs
Grimnoff

Risposte:


422

Probabilmente vuoi fare una query sull'intervallo, ad esempio tutti gli elementi creati dopo una determinata data:

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

Sto usando $gte(maggiore di o uguale a), perché questo è spesso usato per le query di sola data, in cui il componente orario è 00:00:00.

Se vuoi davvero trovare una data uguale a un'altra data, la sintassi sarebbe

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

14
Ahh :) Pensavo stessi usando la console Mongo. C'è ISODateun wrapper per l'oggetto js Date. Prova qualcosa del genere "createdAt" : new Date("2010-01-01"). Per qualche ragione, tuttavia, quel codice non funziona (per v. 2.0.2) nella console Mongo.
mnemosyn,

L'inizializzazione della data userebbe barre anziché trattini? così:new Date("2010/01/01");
Victor S

16

se vuoi ottenere articoli ovunque in quella data devi confrontare due date

È possibile creare due date al di fuori della 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)

16

Ho appena implementato qualcosa di simile in Mongo v3.2.3 usando Nodo v0.12.7 e v4.4.4 e usato:

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

Sto passando un ISODate (ad es. 2016-04-22T00: 00: 00Z) e questo funziona per una query .find () con o senza la funzione toISOString. Ma quando si utilizza in una query .aggregate () $ match, non piace la funzione toISOString!


12

Se vuoi ottenere tutte le novità negli ultimi 5 minuti, dovresti fare alcuni calcoli, ma non è difficile ...

Per prima cosa crea un indice sulla proprietà che desideri abbinare (includi la direzione di ordinamento -1 per la discesa e 1 per la salita)

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

Quindi esegui una query per i documenti creati negli ultimi 5 minuti (60 secondi * 5 minuti) .... poiché javascript .getTime()restituisce millisecondi, devi mulitply di 1000 prima di utilizzarlo come input per il new Date()costruttore.

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

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

Innanzitutto calcoliamo "5 minuti fa":

  1. new Date().getTime() ci dà l'ora corrente in millisecondi
  2. Vogliamo sottrarre 5 minuti (in ms) da quello: 5*60*1000- Mi moltiplico per 60secondi, quindi è facile cambiarlo. Posso solo passare 5a120 se voglio 2 ore (120 minuti).
  3. new Date().getTime()-60*5*1000ci dà 1484383878676(5 minuti fa in ms)

Ora dobbiamo inserirlo in un new Date()costruttore per ottenere il formato di stringa ISO richiesto dai timestamp MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (query mongodb .find ())
  2. Dato che non possiamo avere variabili, facciamo tutto in un colpo solo: new Date(new Date().getTime()-60*5*1000)
  3. ... quindi converti in stringa ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() ci da 2017-01-14T08:53:17.586Z

Naturalmente questo è un po 'più semplice con le variabili se si utilizza il driver nodo-mongodb-nativo, ma questo funziona nella shell mongo che è ciò che di solito uso per controllare le cose.


1
Penso che puoi usare Date.now()invece dinew Date().getTime()
Béranger il

4

Puoi anche provare:

{
    "dateProp": { $gt: new Date('06/15/2016').getTime() }
}

2

Se stai usando Mongoose,

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}

1

Trova con una data specifica:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

Trova con maggiore gteo piccolo lt:

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

Trova per intervallo:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.