No MongoDB, o
$dateToString
operador de pipeline de agregação converte um determinado objeto de data em uma string. O
$dateToString
O operador aceita uma data, um carimbo de data/hora ou um ObjectId. Você pode especificar um formato a ser usado para o resultado fornecendo uma especificação de formato. A especificação de formato pode ser qualquer literal de string, contendo 0 ou mais especificadores de formato.
A especificação do formato é opcional do MongoDB versão 4.0, quando
featureCompatibilityVersion
está definido como 4.0
ou mais alto. As versões anteriores exigem a especificação do formato. Opcionalmente, você pode usar o
timezone
parâmetro para especificar o fuso horário a ser usado. Você também pode usar o
onNull
parâmetro para especificar o que retornar se a data for null
ou ausente. Exemplo
Suponha que tenhamos uma coleção chamada
pets
com o seguinte documento:{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Podemos executar o seguinte código para retornar uma string de data do
born
campo nesse documento. db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { format: "%Y-%m-%dT%H:%M:%S.%LZ", date: "$born" } }
}
}
]
)
Resultado:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Este exemplo usa
%Y-%m-%dT%H:%M:%S.%LZ
como a especificação de formato. Esta é a especificação de formato padrão, mas neste caso nós a especificamos explicitamente. Podemos ver que a string de data é retornada usando o formato especificado. Aqui, usei
dateString
como o nome do campo a ser retornado, mas pode ser qualquer coisa (como formattedDate
, theDate
etc). O
_id
campo é retornado por padrão ao usar projeções no MongoDB, mas neste exemplo eu escondi explicitamente o _id
campo usando _id: 0
. Veja MongoDB
$dateToString
Especificadores de formato para obter uma lista de especificadores de formato disponíveis. Saída padrão
Conforme mencionado, a especificação de formato no exemplo anterior é a especificação de formato padrão.
Se você estiver usando o MongoDB versão 4.0 ou superior, com
featureCompatibilityVersion
definido como 4.0
ou superior (veja como visualizar sua featureCompatibilityVersion
atual e como configurá-lo), você pode omitir a especificação do formato se quiser que a data seja formatada usando o formato acima. Portanto, poderíamos reescrever o anterior. exemplo para isso:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: "$born" } }
}
}
]
)
Resultado:
{ "dateString" : "2020-12-31T23:30:15.123Z" }
Especificar um fuso horário
Você pode especificar um fuso horário a ser usado para a saída do
$dateToString
operador. O fuso horário pode ser especificado usando o identificador de fuso horário Olson (por exemplo,
"Europe/London"
, "GMT"
) ou o deslocamento UTC (por exemplo, "+02:30"
, "-1030"
). Identificador de fuso horário Olson
Aqui está um exemplo que gera a string de data em três fusos horários diferentes, cada um usando os IDs de fuso horário 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()
Resultado:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T12:30" }
Deslocamento UTC
Aqui está um exemplo que usa o deslocamento 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()
Resultado:
{ "UTC" : "2020-12-31T23:30", "Honolulu" : "2020-12-31T13:30", "Auckland" : "2021-01-01T11:30" }
Formato de data de semana ISO
Existem alguns especificadores de formato que permitem a saída da string de data usando o formato ISO 8601.
Em particular, você pode usar:
Especificador de formato | Saída |
---|---|
%G | Ano no formato ISO 8601 |
%u | Número do dia da semana no formato ISO 8601 (1-segunda-feira, 7-domingo) |
%V | Semana do ano no formato ISO 8601 |
Suponha que tenhamos uma coleção chamada
cats
com o seguinte documento:{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Podemos executar o seguinte código para extrair os campos de data ISO do
born
campo nesse documento. Segue um exemplo para demonstrar:
db.cats.aggregate(
[
{
$project: {
_id: 0,
isoYear: { $dateToString: { format: "%G", date: "$born" } },
isoDayOfWeek: { $dateToString: { format: "%u", date: "$born" } },
isoWeekOfYear: { $dateToString: { format: "%V", date: "$born" } }
}
}
]
)
Resultado:
{ "isoYear" : "2020", "isoDayOfWeek" : "7", "isoWeekOfYear" : "53" }
Em contraste, abaixo está o mesmo exemplo, mas usando as partes da data da semana não 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" } }
}
}
]
)
Resultado:
{ "year" : "2021", "dayofweek" : "1", "weekofyear" : "01" }
Podemos ver que o resultado é completamente diferente.
O onNull
Parâmetro
O
onNull
O parâmetro pode ser usado para especificar o que retornar se a data for nula ou não existir. O valor fornecido ao
onNull
parâmetro pode ser qualquer expressão válida. Aqui está um exemplo:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateString: { $dateToString: { date: null, onNull: "No date supplied" } }
}
}
]
)
Resultado:
{ "dateString" : "No date supplied" }
Nesse caso, a data era
null
e assim o documento de saída inclui a string que eu forneci para o onNull
parâmetro. Retorne as partes da data de um ObjectId
Você pode usar
$dateToString
para retornar uma string de data de um ObjectId. Os valores ObjectId são valores hexadecimais de 12 bytes que consistem em:
- Um valor de carimbo de data/hora de 4 bytes, representando a criação do ObjectId, medido em segundos desde a época do Unix.
- Um valor de 5 bytes é aleatório
- Um contador de incremento de 3 bytes, inicializado com um valor aleatório.
Para recapitular, nosso primeiro documento se parece com isso:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Este documento contém um ObjectId. Podemos, portanto, usar
$dateToString
para retornar uma string de data, com base na data em que nosso documento foi criado (ou mais especificamente, quando o _id
valor ObjectId do campo foi criado). Exemplo:
db.pets.aggregate(
[
{
$project: {
timestamp: { $toDate: "$_id" },
dateString: { $dateToString: { format: "%d-%m-%Y", date: "$_id" } }
}
}
]
).pretty()
Resultado:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timestamp" : ISODate("2021-01-19T01:11:35Z"), "dateString" : "19-01-2021" }
Nesse caso, decidi retornar apenas a parte da data (não a parte da hora). Também mudei a ordem dos dias, meses e ano para demonstrar que você certamente pode fazer isso, se necessário.
Eu também usei o
$toDate
operador de pipeline de agregação para retornar a parte de carimbo de data/hora do ObjectId.