MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

5 Möglichkeiten, die Stunde von einem Datum in MongoDB zu erhalten

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 .