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

5 Möglichkeiten, den Monat aus einem Datum in MongoDB abzurufen

MongoDB stellt eine Reihe von Aggregations-Pipeline-Operatoren für die Arbeit mit Datumsangaben bereit, einschließlich Operatoren, die bestimmte Teile von Datumsangaben wie Jahr, Monat, Tag usw. extrahieren.

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 Monatsteil 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 Monatsteils von born Bereich dieser Dokumente.

Der $month Betreiber

Der $month Der Operator wurde speziell entwickelt, um ein Dokument mit dem Monatsteil eines bestimmten Datums zurückzugeben.

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

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

Ergebnis:

{ "birthMonth" : 1 }
{ "birthMonth" : 12 }
{ "birthMonth" : 9 }

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

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

Es gibt Formatbezeichner für jeden Datumsteil. Der %m Formatbezeichner gibt den Monat zurück.

Beispiel:

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

Ergebnis:

{ "birthMonth" : "01" }
{ "birthMonth" : "12" }
{ "birthMonth" : "09" }

Wir hätten mehr Formatbezeichner bereitstellen können, um Datumsteile in das Ergebnis aufzunehmen, aber da wir in diesem Artikel nur daran interessiert sind, den Monat 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 den month 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 weitergegeben werden, um nur den month zu extrahieren Feld.

Folgendes passiert, wenn wir nur für den month eine weitere Projektion hinzufügen Feld:

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

Ergebnis:

{ "birthMonth" : 1 }
{ "birthMonth" : 12 }
{ "birthMonth" : 9 }

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 das Richtige sein.

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 getMonth() zu durchlaufen oder getUTCMonth() um nur den Monatswert zurückzugeben.

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

Ergebnis:

0
11
8

Beachten Sie, dass getMonth() Die JavaScript-Methode gibt die Monatszahl als Ganzzahl zwischen 0 und 11 zurück.

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

Ergebnis:

[ 0, 11, 8 ] 

Auch hier erhalten wir die Monate als ganze Zahlen zwischen 0 und 11.