MongoDB bietet eine gute Auswahl an Aggregations-Pipeline-Operatoren für die Arbeit mit Datumsangaben, einschließlich Operatoren, die bestimmte Teile von Datumsangaben extrahieren, z. B. Jahr, Monat, Tag, Stunden, Minuten usw.
Es gibt auch einige MongoDB-Methoden, mit denen Sie einen Cursor durchlaufen und eine JavaScript-Funktion anwenden können. Sie können daher mit JavaScript Datumswerte und Datumsteile usw. nach Bedarf aus einem Feld extrahieren.
Dieser Artikel stellt 5 Möglichkeiten vor, den Stundenteil von einem Date-Objekt in MongoDB zurückzugeben.
Beispieldaten
Angenommen, wir haben eine Sammlung namens cats
mit folgenden Dokumenten:
{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") } { "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") } { "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }
Die folgenden Beispiele demonstrieren verschiedene Optionen zum Zurückgeben des Stundenanteils von born
Bereich dieser Dokumente.
Die $hour
Betreiber
Die $hour
Der Operator wurde speziell entwickelt, um ein Dokument mit dem Stundenteil eines bestimmten Datums zurückzugeben.
Wir können den folgenden Code ausführen, um den Stundenanteil von born
zurückzugeben Feld im obigen Dokument.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthHour: { $hour: "$born" }
}
}
]
)
Ergebnis:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Sie können auch die Zeitzone angeben, wenn Sie $hour
verwenden Operator.
Siehe MongoDB $hour
für weitere Informationen und Beispiele.
Der $dateToString
Betreiber
Der $dateToString
-Operator konvertiert ein Datumsobjekt gemäß einem benutzerdefinierten Format in eine Zeichenfolge. Der Benutzer kann daher festlegen, dass bei Bedarf nur der Stundenanteil zurückgegeben wird.
Es gibt Formatbezeichner für jeden Datumsteil. Der %H
Formatbezeichner gibt die Stunde zurück.
Beispiel:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthHour: { $dateToString: { format: "%H", date: "$born" } }
}
}
]
)
Ergebnis:
{ "birthHour" : "23" } { "birthHour" : "04" } { "birthHour" : "10" }
Wir hätten mehr Formatbezeichner bereitstellen können, um Datumsteile in das Ergebnis einzubeziehen, aber da wir in diesem Artikel nur daran interessiert sind, die Stunde zu extrahieren, haben wir nur einen Formatbezeichner verwendet.
Siehe MongoDB $dateToString
für weitere Informationen und Beispiele.
Die $dateToParts
Betreiber
Die $dateToParts
-Operator gibt ein Dokument zurück, das die Bestandteile eines bestimmten BSON-Datumswerts als einzelne Eigenschaften enthält. Die zurückgegebenen Eigenschaften sind year
, month
, day
, hour
, minute
, second
und millisecond
.
Wir könnten daher $dateToParts
verwenden in einer Pipelinestufe, fügen Sie dann eine weitere Pipelinestufe hinzu, die die hour
extrahiert Teil.
Hier ist was $dateToParts
Renditen für unsere drei Dokumente:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Ergebnis:
{ "dateParts" : { "year" : 2021, "month" : 1, "day" : 3, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } } { "dateParts" : { "year" : 2019, "month" : 12, "day" : 8, "hour" : 4, "minute" : 0, "second" : 12, "millisecond" : 0 } } { "dateParts" : { "year" : 2020, "month" : 9, "day" : 24, "hour" : 10, "minute" : 30, "second" : 0, "millisecond" : 0 } }
Dieses Ergebnis kann dann an die nächste Stufe in der Pipeline übergeben werden, um nur die hour
zu extrahieren Feld.
Folgendes passiert, wenn wir nur für die hour
eine weitere Projektion hinzufügen Feld:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthHour: "$dateParts.hour"
}
}
]
)
Ergebnis:
{ "birthHour" : 23 } { "birthHour" : 4 } { "birthHour" : 10 }
Der Punkt hier ist, wenn Sie $dateToParts
verwenden in Ihrer Pipeline haben Sie in der nächsten Phase automatisch Zugriff auf den Stundenanteil (und alle anderen Anteile).
Siehe MongoDB $dateToParts
für weitere Informationen und Beispiele.
Der forEach()
Methode
Sie können cursor.forEach()
verwenden um den Cursor mit einer JavaScript-Methode wie getHours()
zu durchlaufen oder getUTCHours()
um nur den Stundenwert zurückzugeben.
db.cats.find().forEach(
function(c) {
print(
c.born.getUTCHours()
);
}
);
Ergebnis:
23 4 10
Das getUTCHours()
Die JavaScript-Methode gibt eine Ganzzahl zwischen 0 und 23 zurück, die die Stunden des angegebenen Datums gemäß Weltzeit darstellt.
Möglicherweise stellen Sie auch fest, dass die vorherigen Optionen ein ganzes Dokument zurückgeben, das ein Name/Wert-Paar enthält, während diese Option nur den tatsächlichen Stundenwert und nicht das ganze Dokument zurückgibt.
Die map()
Methode
Die cursor.map()
Methode wendet eine Funktion auf jedes vom Cursor besuchte Dokument an und kombiniert die Werte in einem Array.
Beispiel:
db.cats.find().map(
function(c) {
c = c.born.getHours();
return c;
}
);
Ergebnis:
[ 9, 14, 20 ]
Sie haben vielleicht bemerkt, dass sich die resultierenden Stunden von den vorherigen Beispielen unterscheiden. Das liegt daran, dass ich in diesem Beispiel getHours()
verwendet habe JavaScript-Methode. Diese Methode gibt ihr Ergebnis gemäß der Ortszeit zurück. Ich hätte genauso gut getUTCHours()
verwenden können .