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

5 maneiras de obter a hora de uma data no MongoDB


O MongoDB fornece uma boa variedade de operadores de pipeline de agregação para trabalhar com datas, incluindo operadores que extraem certas partes de datas, como ano, mês, dia, horas, minutos, etc.

Há também alguns métodos do MongoDB que permitem iterar por meio de um cursor e aplicar uma função JavaScript. Portanto, você pode usar JavaScript para extrair valores de data e partes de data, etc., de um campo conforme necessário.

Este artigo apresenta 5 maneiras de retornar a parte da hora de um objeto Date no MongoDB.

Dados de amostra


Suponha que tenhamos uma coleção chamada cats com os seguintes documentos:
{ "_id" : 1, "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
{ "_id" : 2, "name" : "Meow", "born" : ISODate("2019-12-08T04:00:12Z") }
{ "_id" : 3, "name" : "Fluffy", "born" : ISODate("2020-09-24T10:30:00Z") }

Os exemplos a seguir demonstram várias opções para retornar a parte da hora do born campo desses documentos.

A $hour Operador


A $hour operador é projetado especificamente para devolver um documento com a parte da hora de uma determinada data.

Podemos executar o seguinte código para retornar a parte da hora do born campo no documento acima.
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthHour: { $hour: "$born" }
        }
    }
  ]
)

Resultado:
{ "birthHour" : 23 }
{ "birthHour" : 4 }
{ "birthHour" : 10 }

Você também pode especificar o fuso horário ao usar o $hour operador.

Veja MongoDB $hour para mais informações e exemplos.

A $dateToString Operador


O $dateToString O operador converte um objeto de data em uma string de acordo com um formato especificado pelo usuário. O usuário pode, portanto, especificar que apenas a parte da hora seja retornada, se necessário.

Existem especificadores de formato para cada parte da data. O %H especificador de formato retorna a hora.

Exemplo:
db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthHour: { $dateToString: { format: "%H", date: "$born" } }
       }
     }
   ]
)

Resultado:
{ "birthHour" : "23" }
{ "birthHour" : "04" }
{ "birthHour" : "10" }

Poderíamos ter fornecido mais especificadores de formato para incluir partes de data no resultado, mas como estamos interessados ​​apenas em extrair a hora neste artigo, usamos apenas um especificador de formato.

Veja MongoDB $dateToString para mais informações e exemplos.

As $dateToParts Operador


O $dateToParts O operador retorna um documento que contém as partes constituintes de um determinado valor BSON Date como propriedades individuais. As propriedades retornadas são year , month , day , hour , minute , second e millisecond .

Portanto, poderíamos usar $dateToParts em um estágio de pipeline e, em seguida, adicione outro estágio de pipeline que extraia a hour papel.

Veja o que $dateToParts retornos para nossos três documentos:
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    }
  ]
).pretty()

Resultado:
{
	"dateParts" : {
		"year" : 2021,
		"month" : 1,
		"day" : 3,
		"hour" : 23,
		"minute" : 30,
		"second" : 15,
		"millisecond" : 123
	}
}
{
	"dateParts" : {
		"year" : 2019,
		"month" : 12,
		"day" : 8,
		"hour" : 4,
		"minute" : 0,
		"second" : 12,
		"millisecond" : 0
	}
}
{
	"dateParts" : {
		"year" : 2020,
		"month" : 9,
		"day" : 24,
		"hour" : 10,
		"minute" : 30,
		"second" : 0,
		"millisecond" : 0
	}
}

Esse resultado pode ser passado para o próximo estágio no pipeline para extrair apenas a hour campo.

Veja o que acontece se adicionarmos outra projeção apenas para a hour campo:
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthHour: "$dateParts.hour"
        }
    }
  ]
)

Resultado:
{ "birthHour" : 23 }
{ "birthHour" : 4 }
{ "birthHour" : 10 }

O ponto aqui é, se você usar $dateToParts em seu pipeline, você terá acesso automaticamente à parte da hora (e todas as outras partes) no próximo estágio.

Veja MongoDB $dateToParts para mais informações e exemplos.

O forEach() Método


Você pode usar cursor.forEach() para iterar pelo cursor, usando um método JavaScript como getHours() ou getUTCHours() para retornar apenas o valor da hora.
db.cats.find().forEach(
  function(c) {
    print(
      c.born.getUTCHours()
      );
  }
);

Resultado:
23
4
10

O getUTCHours() O método JavaScript retorna um inteiro, entre 0 e 23, representando as horas na data especificada de acordo com o horário universal.

Você também pode notar que as opções anteriores retornam um documento inteiro que contém um par nome/valor, enquanto esta opção retorna apenas o valor real da hora e não o documento inteiro.

O map() Método


O cursor.map() O método aplica uma função a cada documento visitado pelo cursor e combina os valores em uma matriz.

Exemplo:
db.cats.find().map(
  function(c) {
    c = c.born.getHours();
    return c;
  }
);

Resultado:
[ 9, 14, 20 ]

Você deve ter notado que as horas resultantes são diferentes dos exemplos anteriores. Isso porque neste exemplo eu usei o getHours() Método JavaScript. Este método retorna seu resultado de acordo com o horário local. Eu poderia facilmente ter usado getUTCHours() .