In MongoDB, il $dateToParts
l'operatore della pipeline di aggregazione restituisce le parti della data di una determinata data.
Più specificamente, restituisce un documento che contiene le parti costitutive di un dato valore BSON Date come singole proprietà.
Le parti della data restituite da $dateToParts
sono year
, month
, day
, hour
, minute
, second
e millisecond
.
Quando si utilizza $dateToParts
operatore, puoi facoltativamente specificare un fuso orario da utilizzare per il risultato.
Il $dateToParts
operatore accetta una data (come una data, un timestamp o un ObjectId) o un documento che specifica la data e il fuso orario da utilizzare.
Esempio
Supponiamo di avere una collezione chiamata pets
con il seguente documento:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Possiamo eseguire il codice seguente per restituire le varie parti della data dal born
campo in quel documento.
db.pets.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Risultato:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Possiamo vedere che ogni parte della data viene restituita nel proprio campo.
Qui, ho usato dateParts
come nome del campo da restituire, ma potrebbe essere qualsiasi cosa (come theDate
eccetera).
Il _id
il campo viene restituito per impostazione predefinita quando si utilizzano le proiezioni in MongoDB, ma in questo esempio ho nascosto esplicitamente _id
campo utilizzando _id: 0
.
Specifica un fuso orario
Puoi specificare un fuso orario da utilizzare per l'output di $dateToParts
operatore.
Quando lo fai, l'argomento è passato a $dateToParts
deve essere della seguente forma:
{ date: <dateExpression>, timezone: <tzExpression> }
Dove <dateExpression>
è la data da utilizzare e <tzExpression>
è il fuso orario da utilizzare.
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 restituisce le parti della data in due fusi orari diversi, ciascuno dei quali utilizza gli ID fuso orario Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
).pretty()
Risultato:
{ "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 } }
In questo caso, la data avanza all'anno/mese/settimana/giorno/ora successivo quando si utilizza il Pacific/Auckland
fuso orario.
Offset UTC
Ecco lo stesso esempio, tranne che questa volta usiamo l'offset UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$dateToParts: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$dateToParts: { date: "$born", timezone: "+1200" }
}
}
}
]
).pretty()
Risultato:
{ "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 } }
Parti della data della settimana ISO
Puoi usare iso8601: true
per modificare il documento di output per utilizzare i campi della data della settimana ISO. Questo basa la data sullo standard ISO 8601.
Supponiamo di avere una collezione chiamata cats
con il seguente documento:
{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Possiamo eseguire il codice seguente per estrarre i campi della data ISO da born
campo in quel documento.
Ecco un esempio da dimostrare:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateParts: {
$dateToParts: {
date: "$born"
}
},
datePartsISO: {
$dateToParts: {
date: "$born",
iso8601: true
}
}
}
}
]
).pretty()
Risultato:
{ "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 } }
Il primo documento di output utilizza il normale output di data. Il secondo documento utilizza i campi e i valori della data della settimana ISO.
Restituisci le parti della data da un ObjectId
Puoi usare $dateToParts
per restituire le parti della data da un ObjectId.
I valori ObjectId sono valori esadecimali a 12 byte costituiti da:
- Un valore di timestamp di 4 byte, che rappresenta la creazione dell'ObjectId, misurato in secondi dall'epoca di Unix.
- Un 5 byte è un valore casuale
- Un contatore incrementale di 3 byte, inizializzato su un valore casuale.
Per ricapitolare, il nostro documento si presenta così:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Questo documento contiene un ObjectId. Possiamo quindi utilizzare $dateToParts
restituire le parti di data, in base alla data di creazione del nostro documento (o più specificamente, quando il _id
è stato creato il valore ObjectId del campo).
Esempio:
db.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"dateParts": { $dateToParts: { date: "$_id" } }
}
}
]
).pretty()
Risultato:
{ "_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 } }
In questo caso, ho utilizzato anche $toDate
operatore della pipeline di aggregazione per restituire la parte timestamp di ObjectId.