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

MongoDB $dateFromParts

Dans MongoDB, le $dateFromParts l'opérateur de pipeline d'agrégation construit et renvoie un objet Date à partir des éléments constitutifs de la date.

Vous fournissez chaque partie de date dans un champ séparé.

Vous pouvez spécifier vos champs de date constitutifs au format de date de semaine ISO si nécessaire.

Exemple

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

{
	"_id" : 1,
	"year" : 2020,
	"month" : 12,
	"day" : 31,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123
}

Le document contient un champ différent pour chaque partie de date.

Nous pouvons exécuter le code suivant pour renvoyer un objet de date à partir des champs de ces documents.

db.dateParts.aggregate([
{
   $project: {
      date: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond"
         }
      }
   }
}])

Résultat :

{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }

Toutes les parties date/heure ont été converties en un seul objet date.

Fuseaux horaires

Vous pouvez utiliser le timezone champ pour spécifier un fuseau horaire.

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 utilise les identifiants de fuseau horaire Olson pour générer trois dates différentes à partir d'un seul document, en fonction de trois fuseaux horaires différents.

db.dateParts.aggregate([
{
   $project: {
      dateUTC: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      },
      dateHonolulu: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Honolulu"
         }
      },
      dateAuckland: {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "Pacific/Auckland"
         }
      }
   }
}]).pretty()

Résultat :

{
	"_id" : 1,
	"dateUTC" : ISODate("2020-12-31T10:30:25.123Z"),
	"dateHonolulu" : ISODate("2021-01-01T09:30:25.123Z"),
	"dateAuckland" : ISODate("2020-12-31T10:30:25.123Z")
}

Décalage UTC

Voici un exemple qui utilise le décalage UTC.

db.dateParts.aggregate([
{
   $project: {
      "date+00:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+00:00"
         }
      },
      "date-10:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "-10:00"
         }
      },
      "date+12:00": {
         $dateFromParts: {
            "year": "$year", 
            "month": "$month", 
            "day": "$day", 
            "hour": "$hour", 
            "minute": "$minute", 
            "second": "$second", 
            "millisecond": "$millisecond",
            "timezone": "+12:00"
         }
      }
   }
}]).pretty()

Résultat :

{
	"_id" : 1,
	"date+00:00" : ISODate("2020-12-31T23:30:25.123Z"),
	"date-10:00" : ISODate("2021-01-01T09:30:25.123Z"),
	"date+12:00" : ISODate("2020-12-31T11:30:25.123Z")
}

Format de date de la semaine ISO

Les parties de date peuvent être spécifiées en utilisant le format ISO 8601 si nécessaire.

Vous pouvez notamment utiliser :

Spécificateur de format Sortie
isoWeekYear Année au format ISO 8601. Ce champ est obligatoire si vous n'utilisez pas year (et year est requis si vous n'utilisez pas isoWeekYear ).
isoWeek Semaine de l'année au format ISO 8601. Ne peut être utilisé qu'avec isoWeekYear .
isoDayOfWeek Jour de la semaine (1-lundi, 7-dimanche). Ne peut être utilisé qu'avec isoWeekYear .

Supposons que nous insérions un deuxième document qui ressemble à ceci :

{
	"_id" : 2,
	"isoWeekYear" : 2021,
	"isoWeek" : 32,
	"isoDayOfWeek" : 7,
	"hour" : 23,
	"minute" : 30,
	"second" : 25,
	"millisecond" : 123,
	"timezone" : "UTC"
}

Nous pouvons voir qu'il utilise isoWeekYear , isoWeek , et isoDayOfWeek au lieu de year , month , et day (c'est ce que le premier document utilise).

Nous pouvons utiliser le code suivant pour construire un objet Date à partir de ce document :

db.dateParts.aggregate([
  { $match: { _id: 2} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "isoWeekYear": "$isoWeekYear", 
              "isoWeek": "$isoWeek", 
              "isoDayOfWeek": "$isoDayOfWeek", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond", 
              "timezone": "$timezone"
          }
        }
    }
  }
])

Résultat :

{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") } 

Champs hors limites

À partir de MongoDB 4.4, la plage de valeurs prise en charge pour year et isoWeekYear est 1-9999 . Dans les versions précédentes, la limite inférieure de ces valeurs était 0 et la plage de valeurs prise en charge était 0-9999 .

À partir de MongoDB 4.0, si la valeur spécifiée pour les champs autres que year , isoWeekYear , et timezone est en dehors de la plage valide, le $dateFromParts l'opérateur porte ou soustrait la différence des autres parties de date pour calculer la date.

Valeurs supérieures à la plage

Supposons que nous ajoutions le document suivant à notre collection :

{
	"_id" : 3,
	"year" : 2020,
	"month" : 14,
	"day" : 65,
	"hour" : 48,
	"minute" : 130,
	"second" : 625,
	"millisecond" : 123
}

De nombreux champs de date et d'heure de ce document sont supérieurs à leurs plages valides respectives.

Exécutons la commande suivante pour le convertir en objet Date :

db.dateParts.aggregate([
  { $match: { _id: 3} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Résultat :

{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }

Nous pouvons voir que les parties de date dans l'objet Date résultant sont différentes de leurs parties de date respectives dans le document. C'est parce que $dateFromParts a recalculé la date pour tenir compte des valeurs de partie de date qui dépassaient leur plage normale.

Valeurs inférieures à la plage

Supposons que nous ajoutions le document suivant à notre collection :

{
	"_id" : 4,
	"year" : 2020,
	"month" : 0,
	"day" : 0,
	"hour" : 0,
	"minute" : 0,
	"second" : 0,
	"millisecond" : 0
}

De nombreux champs de date et d'heure de ce document sont inférieurs à leurs plages valides respectives.

Exécutons la commande suivante pour le convertir en objet Date :

db.dateParts.aggregate([
  { $match: { _id: 4} },
  {
    $project: {
        date: {
          $dateFromParts: {
              "year": "$year", 
              "month": "$month", 
              "day": "$day", 
              "hour": "$hour", 
              "minute": "$minute", 
              "second": "$second", 
              "millisecond": "$millisecond"
          }
        }
    }
  }
])

Résultat :

{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }