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

6 maneiras de obter o ano de uma data no MongoDB


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.