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?
Antworten:
Sie möchten wahrscheinlich eine Bereichsabfrage durchführen, z. B. alle Elemente, die nach einem bestimmten Datum erstellt wurden:
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
quelle
ISODate
befindet 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).new Date("2010/01/01");
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.
quelle
Ich habe gerade etwas Ähnliches in Mongo v3.2.3 mit Node v0.12.7 und v4.4.4 implementiert und Folgendes verwendet:
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!
quelle
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).
.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 dennew Date()
Konstruktor verwenden.Die Erklärung für
new Date(new Date().getTime()-60*5*1000).toISOString()
lautet wie folgt:Zuerst berechnen wir "vor 5 Minuten":
new Date().getTime()
gibt uns die aktuelle Zeit in Millisekunden5*60*1000
- Ich multipliziere nur mit60
Sekunden, damit es leicht zu ändern ist. Ich kann einfach wechseln5
,120
wenn ich 2 Stunden (120 Minuten) möchte.new Date().getTime()-60*5*1000
gibt uns1484383878676
(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.{ $gte: new Date(resultFromAbove).toISOString() }
(mongodb .find () Abfrage)new Date(new Date().getTime()-60*5*1000)
.toISOString()
new Date(new Date().getTime()-60*5*1000).toISOString()
gibt uns2017-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.
quelle
Date.now()
anstelle vonnew Date().getTime()
Sie können auch versuchen:
quelle
Wenn Sie Mungo verwenden,
quelle
Mit einem bestimmten Datum finden:
Finden Sie mit mehr
gte
oder wenigerlt
:Suche nach Reichweite:
quelle