Rückfrage basierend auf Datum zurückgeben

208

Ich habe solche Daten 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") 
}

Wie frage ich ab db.gpsdatas.find({'createdAt': ??what here??}), damit mir das obige Datenergebnis von der Datenbank zurückgegeben wird?

coure2011
quelle
Es wäre effektiv gewesen, zu erwähnen, welche NodeJS-Bibliothek Sie verwendet haben, aber basierend auf dem Beispiel scheint es wie seine Mongoosejs
Grimnoff

Antworten:

419

Sie möchten wahrscheinlich eine Bereichsabfrage durchführen, z. B. alle Elemente, die nach einem bestimmten Datum erstellt wurden:

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

Ich verwende $gte(größer oder gleich), da dies häufig für Nur-Datum-Abfragen verwendet wird, bei denen die Zeitkomponente 00:00:00 ist.

Wenn Sie wirklich ein Datum suchen möchten, das einem anderen Datum entspricht, lautet die Syntax

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });
Mnemosyn
quelle
14
Ahh :) Ich dachte du benutzt die Mongo Konsole. Dort ISODatebefindet sich ein Wrapper für das js Date-Objekt. Versuchen Sie etwas wie "createdAt" : new Date("2010-01-01"). Aus irgendeinem Grund funktioniert dieser Code in der Mongo-Konsole jedoch nicht (für Version 2.0.2).
Mnemosyn
Würde die Datumsinitialisierung Schrägstriche anstelle von Bindestrichen verwenden? wie so:new Date("2010/01/01");
Victor S
16

Wenn Sie Artikel an diesem Datum irgendwo erhalten möchten, müssen Sie zwei Daten vergleichen

Sie können zwei Daten aus dem ersten wie diesem erstellen, um den Beginn des Tages und das Ende des Tages zu erhalten.

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)
med116
quelle
16

Ich habe gerade etwas Ähnliches in Mongo v3.2.3 mit Node v0.12.7 und v4.4.4 implementiert und Folgendes verwendet:

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

Ich übergebe ein ISODate (z. B. 2016-04-22T00: 00: 00Z) und dies funktioniert für eine .find () - Abfrage mit oder ohne die Funktion toISOString. Bei Verwendung in einer .aggregate () $ match-Abfrage gefällt die Funktion toISOString jedoch nicht!

Paul
quelle
12

Wenn Sie in den letzten 5 Minuten alle neuen Dinge erhalten möchten, müssten Sie einige Berechnungen durchführen, aber es ist nicht schwer ...

Erstellen Sie zunächst einen Index für die Eigenschaft, mit der Sie übereinstimmen möchten (geben Sie die Sortierrichtung -1 für absteigend und 1 für aufsteigend an).

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

.getTime()Fragen Sie dann nach Dokumenten ab, die in den letzten 5 Minuten (60 Sekunden * 5 Minuten) erstellt wurden. Da Javascript Millisekunden zurückgibt, müssen Sie um 1000 multiplizieren, bevor Sie es als Eingabe für den new Date()Konstruktor verwenden.

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

Die Erklärung für new Date(new Date().getTime()-60*5*1000).toISOString()lautet wie folgt:

Zuerst berechnen wir "vor 5 Minuten":

  1. new Date().getTime() gibt uns die aktuelle Zeit in Millisekunden
  2. Wir wollen 5 Minuten (in ms) davon abziehen: 5*60*1000- Ich multipliziere nur mit 60Sekunden, damit es leicht zu ändern ist. Ich kann einfach wechseln 5, 120wenn ich 2 Stunden (120 Minuten) möchte.
  3. new Date().getTime()-60*5*1000gibt uns 1484383878676(vor 5 Minuten in ms)

Jetzt müssen wir das in einen new Date()Konstruktor einspeisen, um das ISO-Zeichenfolgenformat zu erhalten, das für MongoDB-Zeitstempel erforderlich ist.

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find () Abfrage)
  2. Da wir keine Variablen haben können, machen wir alles auf einmal: new Date(new Date().getTime()-60*5*1000)
  3. ... dann in ISO-String konvertieren: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() gibt uns 2017-01-14T08:53:17.586Z

Natürlich ist dies mit Variablen etwas einfacher, wenn Sie den Node-Mongodb-Native-Treiber verwenden, aber dies funktioniert in der Mongo-Shell, mit der ich normalerweise Dinge überprüfe.

chovy
quelle
1
Ich denke, Sie können Date.now()anstelle vonnew Date().getTime()
Béranger
4

Sie können auch versuchen:

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

Wenn Sie Mungo verwenden,

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

} catch(error) {
    console.log(error)
}
Atul Yadav
quelle
1

Mit einem bestimmten Datum finden:

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

Finden Sie mit mehr gteoder weniger lt:

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

Suche nach Reichweite:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Hamit YILDIRIM
quelle