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.