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

8 Möglichkeiten, den Tag von einem Datum in MongoDB zu erhalten

Beim Extrahieren des Tages aus einem Datum hängt die genaue Option, die wir verwenden, davon ab, wie der Tag dargestellt werden soll.

Wollen wir zum Beispiel den Wochentag, den Tag des Monats oder den Tag des Jahres? Oder wollen wir es vielleicht im ISO 8601-Format? Der Rückgabewert ist normalerweise unterschiedlich, je nachdem, welchen wir wählen.

Dieser Artikel untersucht diese Optionen und stellt daher 8 Möglichkeiten vor, den Tagesteil von einem Datum 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 zur Rückgabe des Tagesanteils von born Bereich dieser Dokumente.

Der $dayOfWeek Betreiber

Wie der Name schon sagt, der $dayOfWeek Der Operator gibt den Wochentag aus einem Datum zurück.

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

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

Ergebnis:

{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 5 }

Es ist auch möglich, die Zeitzone anzugeben, wenn Sie $dayOfWeek verwenden Operator.

Siehe MongoDB $dayOfWeek für weitere Informationen und Beispiele.

Der $dayOfMonth Betreiber

Der $dayOfMonth -Operator gibt den Tag des Monats aus einem Datum zurück.

Beispiel:

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

Ergebnis:

{ "birthDayOfMonth" : 3 }
{ "birthDayOfMonth" : 8 }
{ "birthDayOfMonth" : 24 }

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

Siehe MongoDB $dayOfMonth für weitere Informationen und Beispiele.

Der $dayOfYear Betreiber

Ja, Sie haben es erraten. Der $dayOfYear Der Operator gibt den Tag des Jahres aus einem Datum zurück.

Beispiel:

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

Ergebnis:

{ "birthDayOfYear" : 3 }
{ "birthDayOfYear" : 342 }
{ "birthDayOfYear" : 268 }

Der $dayOfYear Der Operator akzeptiert auch einen Zeitzonenparameter.

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

Es gibt Formatbezeichner für jeden Datumsteil, und wenn es um den Tagesteil geht, haben Sie eine Auswahl an Formatbezeichnern, die davon abhängen, ob Sie den Wochentag, den Tag des Monats, den Tag des Jahres oder den zurückgeben möchten Wochentag im ISO 8601-Format.

Beispiel:

db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
          birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
          birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
          birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
       }
     }
   ]
).pretty()

Ergebnis:

{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "03",
	"birthDayOfYear" : "003",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "08",
	"birthDayOfYear" : "342",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "5",
	"birthDayOfMonth" : "24",
	"birthDayOfYear" : "268",
	"birthDayOfWeekISO" : "4"
}

Wir hätten mehr Formatbezeichner bereitstellen können, um andere Datumsteile in das Ergebnis einzubeziehen, aber da wir in diesem Artikel nur daran interessiert sind, den Tag zu extrahieren, haben wir nur Formatbezeichner für die Rückgabe des Tagesteils verwendet.

Siehe MongoDB $dateToString für weitere Informationen und Beispiele.

Siehe auch MongoDB $dateToString Formatbezeichner für eine Liste von Formatbezeichnern, die Sie mit $dateToString verwenden können .

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önnen daher $dateToParts verwenden in einer Pipelinestufe, fügen Sie dann eine weitere Pipelinestufe hinzu, die den day extrahiert Teil, falls erforderlich.

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 Phase in der Pipeline übergeben werden, um nur den day zu extrahieren Feld.

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

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

Ergebnis:

{ "birthDay" : 3 }
{ "birthDay" : 8 }
{ "birthDay" : 24 }

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 Option sein.

Erwähnenswert ist auch, dass $dateToParts akzeptiert 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 durch den Cursor zu iterieren, wobei eine JavaScript-Methode verwendet wird, um nur den Tageswert zurückzugeben.

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

Ergebnis:

1
0
4

In diesem Fall verwenden wir das JavaScript getDay() -Methode, die eine Ganzzahl zwischen 0 und 6 zurückgibt, die dem Wochentag für das angegebene Datum gemäß der Ortszeit entspricht.

Eine andere Möglichkeit ist die Verwendung von getUTCDay() Methode, die die Weltzeit verwendet. Wir werden diese Methode im nächsten Beispiel verwenden.

Alternativ hätten wir das JavaScript getDate() verwenden können -Methode, die eine Ganzzahl zwischen 1 und 31 zurückgibt, die den Tag des Monats für das angegebene Datum darstellt.

Außerdem gibt diese Option nur den tatsächlichen Tageswert zurück und nicht das gesamte Dokument, wie in den vorherigen Beispielen.

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

Ergebnis:

[ 0, 0, 4 ]

Wie bereits erwähnt, das JavaScript getUTCDay() -Methode gibt ihr Ergebnis unter Verwendung der Weltzeit zurück. In diesem Fall führte dies dazu, dass für das erste Dokument ein anderer Wert zurückgegeben wurde (wir haben 0 erhalten in diesem Beispiel gegenüber 1 im vorherigen).

Der $isoDayOfWeek Betreiber

Wenn Sie den Wochentag im ISO 8601-Format zurückgeben müssen, können Sie $isoDayOfWeek verwenden . 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,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Ergebnis:

{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 4 }

In diesem Fall erhalten wir ein völlig anderes Ergebnis als bei Verwendung von $dayOfWeek Operator, aufgrund der Art und Weise, wie ISO 8601 Datumsangaben berechnet.

Hier ist ein Beispiel, das diesen Unterschied demonstriert:

db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" },
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Ergebnis:

{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }