MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $dateToString


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.