In MongoDB, il $dateFromParts
l'operatore della pipeline di aggregazione costruisce e restituisce un oggetto Date dalle parti costitutive della data.
Fornisci ogni parte della data come un campo separato.
Se necessario, puoi specificare i campi della data costituente nel formato della data della settimana ISO.
Esempio
Supponiamo di avere una collezione chiamata dateParts
con il seguente documento:
{ "_id" : 1, "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123 }
Il documento contiene un campo diverso per ogni parte della data.
Possiamo eseguire il codice seguente per restituire un oggetto data dai campi in quei documenti.
db.dateParts.aggregate([
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}])
Risultato:
{ "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
Tutte le parti di data/ora sono state convertite in un unico oggetto data.
Fusi orari
Puoi utilizzare il timezone
campo per specificare un fuso orario.
Il fuso orario può essere specificato utilizzando l'identificatore del fuso orario Olson (ad es. "Europe/London"
, "GMT"
) o l'offset UTC (ad es. "+02:30"
, "-1030"
).
Identificatore di fuso orario Olson
Ecco un esempio che utilizza gli ID di fuso orario Olson per generare tre date diverse da un unico documento, in base a tre diversi fusi orari.
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()
Risultato:
{ "_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") }
Offset UTC
Ecco un esempio che utilizza l'offset 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()
Risultato:
{ "_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") }
Formato della data della settimana ISO
Le parti della data possono essere specificate utilizzando il formato ISO 8601, se necessario.
In particolare, puoi utilizzare:
Specificatore di formato | Uscita |
---|---|
isoWeekYear | Anno nel formato ISO 8601. Questo campo è obbligatorio se non si utilizza year (e year è richiesto se non si utilizza isoWeekYear ). |
isoWeek | Settimana dell'anno in formato ISO 8601. Può essere utilizzato solo con isoWeekYear . |
isoDayOfWeek | Giorno della settimana (1-lunedì, 7-domenica). Può essere utilizzato solo con isoWeekYear . |
Supponiamo di inserire un secondo documento simile al seguente:
{ "_id" : 2, "isoWeekYear" : 2021, "isoWeek" : 32, "isoDayOfWeek" : 7, "hour" : 23, "minute" : 30, "second" : 25, "millisecond" : 123, "timezone" : "UTC" }
Possiamo vedere che utilizza isoWeekYear
, isoWeek
e isoDayOfWeek
invece di year
, month
e day
(che è ciò che usa il primo documento).
Possiamo usare il codice seguente per costruire un oggetto Date da questo documento:
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"
}
}
}
}
])
Risultato:
{ "_id" : 2, "date" : ISODate("2021-08-15T23:30:25.123Z") }
Campi fuori portata
A partire da MongoDB 4.4, l'intervallo di valori supportato per year
e isoWeekYear
è 1-9999
. Nelle versioni precedenti, il limite inferiore per questi valori era 0
e l'intervallo di valori supportato era 0-9999
.
A partire da MongoDB 4.0, se il valore specificato per campi diversi da year
, isoWeekYear
e timezone
è al di fuori dell'intervallo valido, il $dateFromParts
l'operatore trasporta o sottrae la differenza dalle altre parti della data per calcolare la data.
Valori superiori all'intervallo
Supponiamo di aggiungere il seguente documento alla nostra raccolta:
{ "_id" : 3, "year" : 2020, "month" : 14, "day" : 65, "hour" : 48, "minute" : 130, "second" : 625, "millisecond" : 123 }
Molti dei campi di data e ora in questo documento sono superiori ai rispettivi intervalli validi.
Eseguiamo il seguente comando per convertirlo in un oggetto Date:
db.dateParts.aggregate([
{ $match: { _id: 3} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Risultato:
{ "_id" : 3, "date" : ISODate("2021-04-08T02:20:25.123Z") }
Possiamo vedere che le parti della data nell'oggetto Date risultante sono diverse dalle rispettive parti della data nel documento. Questo perché $dateFromParts
ha ricalcolato la data per tenere conto dei valori della parte della data che hanno superato il loro intervallo normale.
Valori inferiori all'intervallo
Supponiamo di aggiungere il seguente documento alla nostra raccolta:
{ "_id" : 4, "year" : 2020, "month" : 0, "day" : 0, "hour" : 0, "minute" : 0, "second" : 0, "millisecond" : 0 }
Molti dei campi di data e ora in questo documento sono inferiori ai rispettivi intervalli validi.
Eseguiamo il seguente comando per convertirlo in un oggetto Date:
db.dateParts.aggregate([
{ $match: { _id: 4} },
{
$project: {
date: {
$dateFromParts: {
"year": "$year",
"month": "$month",
"day": "$day",
"hour": "$hour",
"minute": "$minute",
"second": "$second",
"millisecond": "$millisecond"
}
}
}
}
])
Risultato:
{ "_id" : 4, "date" : ISODate("2019-11-30T00:00:00Z") }