O MongoDB fornece alguns operadores de pipeline de agregação para trabalhar com datas. Isso inclui 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. Isso, portanto, permite que você use JavaScript para extrair valores de data e partes de data, etc. de um campo.
Este artigo apresenta 6 maneiras de retornar a parte do ano 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 ano do
born
campo desses documentos. O $year
Operador
O
$year
operador é a escolha mais óbvia para extrair a parte do ano de uma data. Ele é projetado especificamente para retornar um documento com a parte do ano de uma data. Podemos executar o seguinte código para retornar o ano do
born
campo no documento acima. db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthYear: { $year: "$born" }
}
}
]
)
Resultado:
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
Você também pode especificar o fuso horário ao usar o
$year
operador. Veja MongoDB
$year
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 ano seja retornada, se necessário. Existem especificadores de formato para cada parte da data. O
%Y
especificador de formato retorna o ano. Exemplo:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthYear: { $dateToString: { format: "%Y", date: "$born" } }
}
}
]
)
Resultado:
{ "birthYear" : "2021" } { "birthYear" : "2019" } { "birthYear" : "2020" }
Poderíamos ter fornecido mais especificadores de formato para incluir partes de data no resultado, mas como estamos interessados apenas em extrair o ano 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
. Armados com esse conhecimento, podemos usar
$dateToParts
em um estágio de pipeline e, em seguida, adicione outro estágio de pipeline que extraia o year
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 } }
Esses dados podem ser passados para o próximo estágio no pipeline para extrair apenas o
year
campo. Veja o que acontece se adicionarmos outra projeção apenas para o
year
campo:db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthYear: "$dateParts.year"
}
}
]
)
Resultado:
{ "birthYear" : 2021 } { "birthYear" : 2019 } { "birthYear" : 2020 }
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 uma opção útil.
O
$dateToParts
operador também aceita um iso8601
parâmetro, que modifica o documento de saída para usar campos de data da semana ISO. Veja MongoDB
$dateToParts
para mais informações e exemplos. O forEach()
Método
Você pode usar
cursor.forEach()
para iterar através do cursor, usando um método JavaScript como getFullYear()
ou getUTCFullYear()
para retornar apenas o valor do ano. db.cats.find().forEach(
function(c) {
print(
c.born.getFullYear()
);
}
);
Resultado:
2021 2019 2020
As opções anteriores retornam um documento inteiro que contém um par nome/valor. Essa opção retorna apenas o valor real do ano 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.getFullYear();
return c;
}
);
Resultado:
[ 2021, 2019, 2020 ]
O $isoWeekYear
Operador
Se você precisar retornar o ano no formato ISO 8601, use
$isoWeekYear
. O ano ISO 8601 começa com a segunda-feira da semana 1 e termina com o domingo da última semana. Exemplo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoWeekYear: { $isoWeekYear: "$born" }
}
}
]
)
Resultado:
{ "birthIsoWeekYear" : NumberLong(2020) } { "birthIsoWeekYear" : NumberLong(2019) } { "birthIsoWeekYear" : NumberLong(2020) }
Observe que o primeiro ano agora é 2020 em vez de 2021, como nos exemplos anteriores. Nem todos os anos serão diferentes ao usar
$isoWeekYear
, pois depende da data em questão.