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()
.