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 }