MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $dateToParts

Dans MongoDB, le $dateToParts L'opérateur de pipeline d'agrégation renvoie les parties de date d'une date donnée.

Plus précisément, il renvoie un document qui contient les parties constitutives d'une valeur de date BSON donnée en tant que propriétés individuelles.

Les parties de date renvoyées par $dateToParts sont year , month , day , hour , minute , second et millisecond .

Lors de l'utilisation de $dateToParts opérateur, vous pouvez éventuellement spécifier un fuseau horaire à utiliser pour le résultat.

Le $dateToParts L'opérateur accepte soit une date (sous forme de Date, d'horodatage ou d'ObjectId), soit un document qui spécifie la date et le fuseau horaire à utiliser.

Exemple

Supposons que nous ayons une collection appelée pets avec le document suivant :

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Nous pouvons exécuter le code suivant pour renvoyer les différentes parties de date à partir du born champ dans ce document.

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

Résultat :

{
	"dateParts" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Nous pouvons voir que chaque partie de date est renvoyée dans son propre champ.

Ici, j'ai utilisé dateParts comme nom de champ à retourner, mais cela aurait pu être n'importe quoi (comme theDate etc).

Le _id le champ est renvoyé par défaut lors de l'utilisation de projections dans MongoDB, mais dans cet exemple, j'ai explicitement caché le _id champ utilisant _id: 0 .

Spécifiez un fuseau horaire

Vous pouvez spécifier un fuseau horaire à utiliser pour la sortie du $dateToParts opérateur.

Lorsque vous faites cela, l'argument est passé à $dateToParts doit être de la forme suivante :

{ date: <dateExpression>, timezone: <tzExpression> }

<dateExpression> est la date à utiliser, et <tzExpression> est le fuseau horaire à utiliser.

Le fuseau horaire peut être spécifié à l'aide de l'identifiant de fuseau horaire Olson (par exemple, "Europe/London" , "GMT" ) ou le décalage UTC (par exemple "+02:30" , "-1030" ).

Identifiant de fuseau horaire Olson

Voici un exemple qui génère les parties de date dans deux fuseaux horaires différents, chacun utilisant les ID de fuseau horaire Olson :

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          honolulu: { 
            $dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
            },
          auckland: { 
            $dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
            }
        }
    }
  ]
).pretty()

Résultat :

{
	"honolulu" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 13,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"auckland" : {
		"year" : 2021,
		"month" : 1,
		"day" : 1,
		"hour" : 12,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Dans ce cas, la date avance à l'année/mois/semaine/jour/heure suivant(e) lors de l'utilisation du Pacific/Auckland fuseau horaire.

Décalage UTC

Voici le même exemple, sauf que cette fois nous utilisons le décalage UTC.

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          "utcOffset-1000": { 
            $dateToParts: { date: "$born", timezone: "-1000" }
            },
          "utcOffset+1200": { 
            $dateToParts: { date: "$born", timezone: "+1200" }
            }
        }
    }
  ]
).pretty()

Résultat :

{
	"utcOffset-1000" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 13,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"utcOffset+1200" : {
		"year" : 2021,
		"month" : 1,
		"day" : 1,
		"hour" : 11,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Parties de la date de la semaine ISO

Vous pouvez utiliser iso8601: true pour modifier le document de sortie afin d'utiliser les champs de date de semaine ISO. Cela base la date sur la norme ISO 8601.

Supposons que nous ayons une collection appelée cats avec le document suivant :

{
	"_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"),
	"name" : "Scratch",
	"born" : ISODate("2021-01-03T23:30:15.123Z")
}

Nous pouvons exécuter le code suivant pour extraire les champs de date ISO du born champ dans ce document.

Voici un exemple pour illustrer :

db.pets.aggregate(
  [
    {
      $project: {
          _id: 0,
          dateParts: { 
            $dateToParts: { 
              date: "$born"
            }
          },
          datePartsISO: { 
            $dateToParts: { 
              date: "$born",
              iso8601: true
            }
          }
      }
    }
  ]
).pretty()

Résultat :

{
	"dateParts" : {
		"year" : 2020,
		"month" : 12,
		"day" : 31,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	},
	"datePartsISO" : {
		"isoWeekYear" : 2020,
		"isoWeek" : 53,
		"isoDayOfWeek" : 4,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}

Le premier document de sortie utilise la sortie de date normale. Le deuxième document utilise les champs et valeurs de date de semaine ISO.

Renvoyer les parties de date d'un ObjectId

Vous pouvez utiliser $dateToParts pour renvoyer les parties de date d'un ObjectId.

Les valeurs ObjectId sont des valeurs hexadécimales de 12 octets qui se composent de :

  • Une valeur d'horodatage de 4 octets, représentant la création de l'ObjectId, mesurée en secondes depuis l'époque Unix.
  • A 5 octets est une valeur aléatoire
  • Un compteur incrémentant de 3 octets, initialisé à une valeur aléatoire.

Pour récapituler, notre document ressemble à ceci :

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"name" : "Fetch",
	"born" : ISODate("2020-12-31T23:30:15.123Z")
}

Ce document contient un ObjectId. On peut donc utiliser $dateToParts pour renvoyer les parties de date, en fonction de la date à laquelle notre document a été créé (ou plus précisément, lorsque le _id la valeur ObjectId du champ a été créée).

Exemple :

db.pets.aggregate(
  [
    {
      $project:
        {
          "timeStamp": { $toDate: "$_id"},
          "dateParts": { $dateToParts: { date: "$_id" } }
        }
    }
  ]
).pretty()

Résultat :

{
	"_id" : ObjectId("600631c7c8eb4369cf6ad9c8"),
	"timeStamp" : ISODate("2021-01-19T01:11:35Z"),
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 19,
		"hour" : 1,
		"minute" : 11,
		"second" : 35,
		"millisecond" : 0
	}
}

Dans ce cas, j'ai également utilisé le $toDate opérateur de pipeline d'agrégation pour renvoyer la partie horodatage de l'ObjectId.