HOWTO · MongoDB

Speichern Sie Datum und Uhrzeit in MongoDB

Dieses MongoDB-Tutorial erläutert den Unterschied zwischen Date(), das einen String zurückgibt, und new Date(), das einen Datumswert erzeugt. Es zeigt, wie Sie Datumswerte speichern und Datumsfelder abfragen und mit sort() chronologisch sortieren.

Auf dieser Seite

Um ein Datum in MongoDB zu speichern, übergeben Sie einen JavaScript-Wert vom Typ Date, der üblicherweise mit new Date() erstellt wird. In mongosh gibt Date() ohne new einen String zurück; damit entsteht kein Datumswert für ein Dokument. Dieser Leitfaden erläutert den Unterschied, eine Datumsbereichsabfrage mit ISODate() sowie das chronologische Sortieren und die Fehlersuche.

Date() und new Date() in MongoDB verwenden

Date() gibt das aktuelle Datum und die aktuelle Uhrzeit als String zurück. Verwenden Sie new Date(), wenn Sie einen JavaScript-Wert vom Typ Date benötigen, den MongoDB als BSON Date speichern kann. Für einen festen Zeitpunkt übergeben Sie einen ISO-8601-Zeitstempel mit einer expliziten UTC-Kennzeichnung wie Z:

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

console.log(new Date("2024-06-01T12:00:00Z").toISOString());
2024-06-01T12:00:00.000Z

Dieses JavaScript-Beispiel veranschaulicht ausschließlich die Erstellung eines Datumswerts; MongoDB-Operationen erfordern eine mongosh-Sitzung. Verwenden Sie den Wert bei einem Einfüge- oder Aktualisierungsvorgang direkt, zum Beispiel mit db.products.insertOne({ item: "apple", dateAdded: new Date() }). Das Dokument speichert in dateAdded einen BSON-Date-Wert und nicht den von Date() zurückgegebenen String.

Datumswerte in MongoDB abfragen und sortieren

Ein Datumsfeld lässt sich mit sort() aufsteigend oder absteigend sortieren: Verwenden Sie 1 für die aufsteigende Reihenfolge (frühere Datumswerte zuerst) und -1 für die absteigende Reihenfolge (spätere Datumswerte zuerst). Beispielsweise sortiert db.posts.find().sort({ date: 1 }) die Dokumente in posts anhand des Feldes date vom frühesten bis zum spätesten Wert. db.posts.find().sort({ date: -1 }) liefert die umgekehrte Reihenfolge. Bei diesen Abfragen wird vorausgesetzt, dass die Feldwerte einheitlich als Datumswerte gespeichert sind.

Ein String, der wie ein ISO-Zeitstempel aussieht, bleibt ein String. Enthält ein Feld sowohl Strings als auch BSON-Date-Werte, sortiert MongoDB zunächst nach der BSON-Typreihenfolge und anschließend innerhalb jedes Typs nach dem Wert. Daher muss das Ergebnis nicht über alle Dokumente hinweg chronologisch sein. Für eine zuverlässige Datumssortierung sollten Sie die Feldwerte in BSON Date vereinheitlichen und in der Abfrage denselben Feldnamen sowie die gewünschte Sortierrichtung verwenden.

Wenn die Ergebnisse unerwartet sortiert sind, prüfen Sie, ob die Abfrage auf die richtige Collection zugreift, der Sortierschlüssel dem gespeicherten Feldnamen entspricht, die Werte durchgehend den BSON-Typ Date verwenden und die Sortierrichtung wie beabsichtigt auf 1 oder -1 gesetzt ist. Eine Collection enthält Dokumente; ein Dokument enthält das Datumsfeld.

ISODate() in MongoDB-Datumsabfragen verwenden

ISODate() ist eine mongosh-Hilfsfunktion, mit der in Shell-Beispielen ein Datumswert dargestellt wird; sie ist kein eigener BSON-Typ. Verwenden Sie sie, um Datumsgrenzen in einer Abfrage anzugeben. Das folgende Beispiel findet Dokumente, deren AdmissionDate ab Mitternacht UTC am 7. Juni 2013 (einschließlich) bis Mitternacht UTC am 8. Juni (ausschließlich) liegt:

db.students.find({ AdmissionDate: { $gte: ISODate("2013-06-07T00:00:00Z"), $lt: ISODate("2013-06-08T00:00:00Z") } })

$gte schließt den Startzeitpunkt ein und $lt schließt den Endzeitpunkt aus. Dadurch wird derselbe Zeitpunkt nicht in zwei direkt aufeinanderfolgenden Tagesbereichen berücksichtigt. Achten Sie darauf, dass der Feldname in der Abfrage mit dem gespeicherten BSON-Date-Feld übereinstimmt.

Diese mongosh-Snippets dienen zur Veranschaulichung und werden nicht als Laufzeitausgabe dargestellt. Führen Sie sie in einer MongoDB-Shell aus, die mit einer Datenbank verbunden ist, in der die genannten Collections und Felder vorhanden sind; die Ergebnisse von find() hängen von diesen Daten ab.

Fazit

Verwenden Sie new Date(), um einen Datumswert zu speichern, und beachten Sie, dass Date() einen String zurückgibt. Fragen Sie Datumsfelder in mongosh mit ISODate()-Grenzen ab und sortieren Sie einheitlich typisierte BSON-Date-Werte mit sort(). Wenn die Sortierung unerwartet ausfällt, überprüfen Sie den Feldnamen, die BSON-Typen und die Sortierrichtung.