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

6 Möglichkeiten, das Jahr aus einem Datum in MongoDB abzurufen

MongoDB bietet eine ganze Reihe von Aggregations-Pipeline-Operatoren für die Arbeit mit Daten. Dazu gehören Operatoren, die bestimmte Teile von Daten extrahieren, wie z. B. Jahr, Monat, Tag usw.

Es gibt auch einige MongoDB-Methoden, mit denen Sie einen Cursor durchlaufen und eine JavaScript-Funktion anwenden können. Dadurch können Sie JavaScript verwenden, um Datumswerte und Datumsteile usw. aus einem Feld zu extrahieren.

Dieser Artikel stellt 6 Möglichkeiten vor, den Jahresteil eines Datums 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 Jahresanteils von born Bereich dieser Dokumente.

Das $year Betreiber

Das $year -Operator ist die naheliegendste Wahl, um den Jahresteil aus einem Datum zu extrahieren. Es wurde speziell entwickelt, um ein Dokument mit dem Jahresteil eines Datums zurückzugeben.

Wir können den folgenden Code ausführen, um das Jahr von born zurückzugeben Feld im obigen Dokument.

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthYear: { $year: "$born" }
        }
    }
  ]
)

Ergebnis:

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

Sie können auch die Zeitzone angeben, wenn Sie $year verwenden Operator.

Siehe MongoDB $year 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 Jahresanteil zurückgegeben wird.

Es gibt Formatbezeichner für jeden Datumsteil. Der %Y Formatbezeichner gibt das Jahr zurück.

Beispiel:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthYear: { $dateToString: { format: "%Y", date: "$born" } }
       }
     }
   ]
)

Ergebnis:

{ "birthYear" : "2021" }
{ "birthYear" : "2019" }
{ "birthYear" : "2020" }

Wir hätten mehr Formatbezeichner bereitstellen können, um Datumsteile in das Ergebnis einzubeziehen, aber da wir in diesem Artikel nur daran interessiert sind, das Jahr 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 .

Mit diesem Wissen können wir $dateToParts verwenden in einer Pipelinestufe, fügen Sie dann eine weitere Pipelinestufe hinzu, die das year 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
	}
}

Diese Daten können an die nächste Stufe in der Pipeline weitergegeben werden, um nur das year zu extrahieren Feld.

Folgendes passiert, wenn wir nur für das year eine weitere Hochrechnung hinzufügen Feld:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthYear: "$dateParts.year"
        }
    }
  ]
)

Ergebnis:

{ "birthYear" : 2021 }
{ "birthYear" : 2019 }
{ "birthYear" : 2020 }

Dies ist offensichtlich nicht so prägnant wie die Verwendung der vorherigen Optionen. Je nachdem, was Sie in Ihrer Pipeline tun, könnte dieser Ansatz jedoch eine praktische Option sein.

Die $dateToParts Operator akzeptiert auch einen iso8601 -Parameter, der das Ausgabedokument so modifiziert, dass ISO-Wochendatumsfelder verwendet werden.

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 getFullYear() zu durchlaufen oder getUTCFullYear() um nur den Jahreswert zurückzugeben.

db.cats.find().forEach(
  function(c) {
    print(
      c.born.getFullYear()
      );
  }
);

Ergebnis:

2021
2019
2020

Die vorherigen Optionen geben ein ganzes Dokument zurück, das ein Name/Wert-Paar enthält. Diese Option gibt nur den tatsächlichen Jahreswert und nicht das gesamte Dokument zurück.

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.getFullYear();
    return c;
  }
);

Ergebnis:

[ 2021, 2019, 2020 ]

Das $isoWeekYear Betreiber

Wenn Sie das Jahr im ISO 8601-Format zurückgeben müssen, verwenden Sie $isoWeekYear . Das ISO 8601-Jahr beginnt mit dem Montag der 1. Woche und endet mit dem Sonntag der letzten Woche.

Beispiel:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthIsoWeekYear: { $isoWeekYear: "$born" }
        }
    }
  ]
)

Ergebnis:

{ "birthIsoWeekYear" : NumberLong(2020) }
{ "birthIsoWeekYear" : NumberLong(2019) }
{ "birthIsoWeekYear" : NumberLong(2020) }

Beachten Sie, dass das erste Jahr jetzt 2020 statt 2021 wie in den vorherigen Beispielen ist. Nicht alle Jahre sind unterschiedlich, wenn $isoWeekYear verwendet wird , weil es vom jeweiligen Datum abhängt.