O MongoDB fornece vários operadores de pipeline de agregação para trabalhar com datas, incluindo operadores que extraem certas partes de datas, como ano, mês, dia 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 do mês de uma data 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 do mês do
born
campo desses documentos. O $month
Operador
O
$month
operador é projetado especificamente para devolver um documento com a parte do mês de uma determinada data. Podemos executar o seguinte código para retornar o mês do
born
campo no documento acima. db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthMonth: { $month: "$born" }
}
}
]
)
Resultado:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Você também pode especificar o fuso horário ao usar o
$month
operador. Veja MongoDB
$month
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 do mês seja retornada, se necessário. Existem especificadores de formato para cada parte da data. O
%m
especificador de formato retorna o mês. Exemplo:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthMonth: { $dateToString: { format: "%m", date: "$born" } }
}
}
]
)
Resultado:
{ "birthMonth" : "01" } { "birthMonth" : "12" } { "birthMonth" : "09" }
Poderíamos ter fornecido mais especificadores de formato para incluir partes de data no resultado, mas como estamos interessados apenas em extrair o mês 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 o month
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 o
month
campo. Veja o que acontece se adicionarmos outra projeção apenas para o
month
campo:db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthMonth: "$dateParts.month"
}
}
]
)
Resultado:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
Obviamente, isso não é tão conciso quanto usar as opções anteriores. No entanto, dependendo do que você está fazendo em seu pipeline, essa abordagem pode ser adequada.
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 getMonth()
ou getUTCMonth()
para retornar apenas o valor do mês. db.cats.find().forEach(
function(c) {
print(
c.born.getMonth()
);
}
);
Resultado:
0 11 8
Observe que o
getMonth()
O método JavaScript retorna o número do mês como um número inteiro, entre 0 e 11. 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 do mês 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.getMonth();
return c;
}
);
Resultado:
[ 0, 11, 8 ]
Novamente, obtemos os meses como números inteiros entre 0 e 11.