In MongoDB, il $dateToString
l'operatore della pipeline di aggregazione converte un determinato oggetto data in una stringa.
Il $dateToString
l'operatore accetta una data, un timestamp o un ObjectId.
È possibile specificare un formato da utilizzare per il risultato fornendo una specifica del formato. La specifica del formato può essere qualsiasi stringa letterale, contenente 0 o più identificatori di formato.
La specifica del formato è facoltativa da MongoDB versione 4.0, quando featureCompatibilityVersion
è impostato su 4.0
o più alto. Le versioni precedenti richiedono la specifica del formato.
Puoi opzionalmente utilizzare il timezone
parametro per specificare il fuso orario da utilizzare.
Puoi anche usare onNull
parametro per specificare cosa restituire se la data è null
o mancante.
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 una stringa di data da born
campo in quel documento.
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
Risultato:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Questo esempio utilizza %Y-%m-%dT%H:%M:%S.%LZ
come specifica del formato. Questa è la specifica di formato predefinita, ma in questo caso l'abbiamo specificata esplicitamente. Possiamo vedere che la stringa della data viene restituita utilizzando il formato specificato.
Qui, ho usato dateString
come nome del campo da restituire, ma potrebbe essere qualsiasi cosa (come formattedDate
, 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
.
Vedi MongoDB $dateToString
Specificatori di formato per un elenco di identificatori di formato disponibili.
Uscita predefinita
Come accennato, la specifica del formato nell'esempio precedente è la specifica del formato predefinita.
Se stai utilizzando MongoDB versione 4.0 o successiva, con featureCompatibilityVersion
impostato su 4.0
o superiore (vedi come visualizzare la tua attuale featureCompatibilityVersion
e come impostarlo), puoi omettere la specifica del formato se desideri formattare la data utilizzando il formato sopra.
Pertanto, potremmo riscrivere il precedente. esempio a questo:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Risultato:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Specifica un fuso orario
Puoi specificare un fuso orario da utilizzare per l'output di $dateToString
operatore.
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 la stringa della data in tre diversi fusi orari, ciascuno dei quali utilizza gli ID fuso orario Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "UTC" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Honolulu" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "Pacific/Auckland" } }
}
}
]
).pretty()
Risultato:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
Offset UTC
Ecco un esempio che utilizza l'offset UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
UTC: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+00:00" } },
Honolulu: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "-10:00" } },
Auckland: { $dateToString: { format: "%Y-%m-%dT%H:%M", date: "$born", timezone: "+12:00" } }
}
}
]
).pretty()
Risultato:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
Formato della data della settimana ISO
Esistono alcuni identificatori di formato che consentono di generare la stringa della data utilizzando il formato ISO 8601.
In particolare, puoi utilizzare:
Specificatore di formato | Uscita |
---|---|
%G | Anno in formato ISO 8601 |
%u | Numero del giorno della settimana in formato ISO 8601 (1-lunedì, 7-domenica) |
%V | Settimana dell'anno in formato 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.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
Risultato:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
Al contrario, di seguito è riportato lo stesso esempio, ma utilizzando le parti della data della settimana non ISO.
db.cats.aggregate(
[
{
$project: {
_id: 0,
year: { $dateToString: { format: "%Y", date: "$born" } },
dayofweek: { $dateToString: { format: "%w", date: "$born" } },
weekofyear: { $dateToString: { format: "%U", date: "$born" } }
}
}
]
)
Risultato:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
Possiamo vedere che il risultato è completamente diverso.
Il onNull
Parametro
Il onNull
il parametro può essere utilizzato per specificare cosa restituire se la data è nulla o non esiste.
Il valore fornito a onNull
parametro può essere qualsiasi espressione valida.
Ecco un esempio:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Risultato:
{ "dateString" : "No date supplied" }
In questo caso, la data era null
e quindi il documento di output include la stringa che ho fornito per onNull
parametro.
Restituisci le parti della data da un ObjectId
Puoi usare $dateToString
per restituire una stringa di 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 primo documento si presenta così:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Questo documento contiene un ObjectId. Possiamo quindi usare $dateToString
per restituire una stringa di data, basata sulla data di creazione del nostro documento (o più precisamente, quando il _id
è stato creato il valore ObjectId del campo).
Esempio:
db.pets.aggregate(
[
{
$project: {
timestamp: { $toDate: "$_id" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
Risultato:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
In questo caso, ho deciso di restituire solo la parte della data (non la parte dell'ora). Ho anche cambiato l'ordine dei giorni, dei mesi e dell'anno per dimostrare che puoi sicuramente farlo se necessario.
Ho anche usato $toDate
operatore della pipeline di aggregazione per restituire la parte timestamp di ObjectId.