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

8 maneiras de obter o dia de uma data no MongoDB


Ao extrair o dia de uma data, a opção exata que usamos dependerá de como queremos que o dia seja representado.

Por exemplo, queremos o dia da semana, o dia do mês ou o dia do ano? Ou talvez queiramos no formato ISO 8601? O valor de retorno geralmente será diferente dependendo de qual escolhermos.

Este artigo explora essas opções e, portanto, apresenta 8 maneiras de retornar a parte do dia 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 dia do born campo desses documentos.

O $dayOfWeek Operador


Como o nome indica, o $dayOfWeek operador retorna o dia da semana a partir de uma data.

Podemos executar o seguinte código para retornar o dia da semana do born campo no documento acima.
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" }
        }
    }
  ]
)

Resultado:
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 1 }
{ "birthDayOfWeek" : 5 }

Também é possível especificar o fuso horário ao usar o $dayOfWeek operador.

Veja MongoDB $dayOfWeek para mais informações e exemplos.

O $dayOfMonth Operador


O $dayOfMonth operador retorna o dia do mês de uma data.

Exemplo:
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfMonth: { $dayOfMonth: "$born" }
        }
    }
  ]
)

Resultado:
{ "birthDayOfMonth" : 3 }
{ "birthDayOfMonth" : 8 }
{ "birthDayOfMonth" : 24 }

Você também pode especificar o fuso horário ao usar o $dayOfMonth operador.

Veja MongoDB $dayOfMonth para mais informações e exemplos.

O $dayOfYear Operador


Sim, você adivinhou. O $dayOfYear operador retorna o dia do ano a partir de uma data.

Exemplo:
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfYear: { $dayOfYear: "$born" }
        }
    }
  ]
)

Resultado:
{ "birthDayOfYear" : 3 }
{ "birthDayOfYear" : 342 }
{ "birthDayOfYear" : 268 }

O $dayOfYear O operador também aceita um parâmetro de fuso horário.

Veja MongoDB $dayOfYear 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 dia seja retornada, se necessário.

Existem especificadores de formato para cada parte da data e, quando se trata da parte do dia, você pode escolher os especificadores de formato que dependerão se você deseja retornar o dia da semana, o dia do mês, o dia do ano ou o dia da semana no formato ISO 8601.

Exemplo:
db.cats.aggregate(
   [
     {
       $project: {
         _id: 0,
          birthDayOfWeek: { $dateToString: { format: "%w", date: "$born" } },
          birthDayOfMonth: { $dateToString: { format: "%d", date: "$born" } },
          birthDayOfYear: { $dateToString: { format: "%j", date: "$born" } },
          birthDayOfWeekISO: { $dateToString: { format: "%u", date: "$born" } }
       }
     }
   ]
).pretty()

Resultado:
{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "03",
	"birthDayOfYear" : "003",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "1",
	"birthDayOfMonth" : "08",
	"birthDayOfYear" : "342",
	"birthDayOfWeekISO" : "7"
}
{
	"birthDayOfWeek" : "5",
	"birthDayOfMonth" : "24",
	"birthDayOfYear" : "268",
	"birthDayOfWeekISO" : "4"
}

Poderíamos ter fornecido mais especificadores de formato para incluir outras partes de data no resultado, mas como estamos interessados ​​apenas em extrair o dia neste artigo, usamos apenas especificadores de formato para retornar a parte do dia.

Veja MongoDB $dateToString para mais informações e exemplos.

Veja também MongoDB $dateToString Especificadores de formato para uma lista de especificadores de formato que você pode usar com $dateToString .

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 .

Podemos, portanto, usar $dateToParts em um estágio de pipeline e, em seguida, adicione outro estágio de pipeline que extraia o day parte se necessário.

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 day campo.

Veja o que acontece se adicionarmos outra projeção apenas para o day campo:
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          dateParts: { $dateToParts: { date: "$born" } }
        }
    },
    {
      $project:
        {
          birthDay: "$dateParts.day"
        }
    }
  ]
)

Resultado:
{ "birthDay" : 3 }
{ "birthDay" : 8 }
{ "birthDay" : 24 }

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.

Também vale a pena mencionar que $dateToParts 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 pelo cursor, usando um método JavaScript para retornar apenas o valor do dia.
db.cats.find().forEach(
  function(c) {
    print(
      c.born.getDay()
      );
  }
);

Resultado:
1
0
4

Neste caso, usamos o JavaScript getDay() método, que retorna um número inteiro, entre 0 e 6, correspondente ao dia da semana para a data especificada, de acordo com o horário local.

Outra opção é usar o getUTCDay() método, que usa o tempo universal. Usaremos esse método no próximo exemplo.

Alternativamente, poderíamos ter usado o JavaScript getDate() método, que retorna um número inteiro, entre 1 e 31, representando o dia do mês para a data especificada.

Além disso, essa opção retorna apenas o valor do dia real e não o documento inteiro, como nos exemplos anteriores.

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.getUTCDay();
    return c;
  }
);

Resultado:
[ 0, 0, 4 ]

Como mencionado, o JavaScript getUTCDay() retorna seu resultado usando o tempo universal. Nesse caso, resultou em um valor diferente retornado para o primeiro documento (obtemos 0 neste exemplo, versus 1 no anterior).

O $isoDayOfWeek Operador


Se você precisar retornar o dia da semana no formato ISO 8601, você pode usar $isoDayOfWeek . 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,
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Resultado:
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 7 }
{ "birthIsoDayOfWeek" : 4 }

Neste caso, obtemos um resultado completamente diferente do que obtivemos ao usar o $dayOfWeek operador, devido à forma como a ISO 8601 calcula as datas.

Aqui está um exemplo que demonstra essa diferença:
db.cats.aggregate(
  [
    {
      $project:
        {
          _id: 0,
          birthDayOfWeek: { $dayOfWeek: "$born" },
          birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
        }
    }
  ]
)

Resultado:
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 1, "birthIsoDayOfWeek" : 7 }
{ "birthDayOfWeek" : 5, "birthIsoDayOfWeek" : 4 }