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

5 maneiras de obter o mês de uma data no MongoDB


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.