No MongoDB, o
$dateToParts
operador de pipeline de agregação retorna as partes de data de uma determinada data. Mais especificamente, ele retorna um documento que contém as partes constituintes de um determinado valor BSON Date como propriedades individuais.
As partes da data retornadas por
$dateToParts
são year
, month
, day
, hour
, minute
, second
e millisecond
. Ao usar o
$dateToParts
operador, você pode especificar opcionalmente um fuso horário para usar para o resultado. O
$dateToParts
O operador aceita uma data (como Date, Timestamp ou ObjectId) ou um documento que especifica a data e o fuso horário a serem usados. Exemplo
Suponha que tenhamos uma coleção chamada
pets
com o seguinte documento:{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Podemos executar o seguinte código para retornar as várias partes de data do
born
campo nesse documento. db.pets.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
}
]
).pretty()
Resultado:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Podemos ver que cada parte da data é retornada em seu próprio campo.
Aqui, usei
dateParts
como o nome do campo a ser retornado, mas pode ser qualquer coisa (como theDate
etc). O
_id
campo é retornado por padrão ao usar projeções no MongoDB, mas neste exemplo eu escondi explicitamente o _id
campo usando _id: 0
. Especificar um fuso horário
Você pode especificar um fuso horário a ser usado para a saída do
$dateToParts
operador. Quando você faz isso, o argumento é passado para
$dateToParts
deve ter a seguinte forma:{ date: <dateExpression>, timezone: <tzExpression> }
Onde
<dateExpression>
é a data a ser usada e <tzExpression>
é o fuso horário a ser usado. O fuso horário pode ser especificado usando o identificador de fuso horário Olson (por exemplo,
"Europe/London"
, "GMT"
) ou o deslocamento UTC (por exemplo, "+02:30"
, "-1030"
). Identificador de fuso horário Olson
Aqui está um exemplo que gera as partes da data em dois fusos horários diferentes, cada um usando os IDs de fuso horário Olson:
db.pets.aggregate(
[
{
$project: {
_id: 0,
honolulu: {
$dateToParts: { date: "$born", timezone: "Pacific/Honolulu" }
},
auckland: {
$dateToParts: { date: "$born", timezone: "Pacific/Auckland" }
}
}
}
]
).pretty()
Resultado:
{ "honolulu" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "auckland" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 12, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Nesse caso, a data avança para o próximo ano/mês/semana/dia/hora ao usar o
Pacific/Auckland
fuso horário. Deslocamento UTC
Aqui está o mesmo exemplo, exceto que desta vez usamos o deslocamento UTC.
db.pets.aggregate(
[
{
$project: {
_id: 0,
"utcOffset-1000": {
$dateToParts: { date: "$born", timezone: "-1000" }
},
"utcOffset+1200": {
$dateToParts: { date: "$born", timezone: "+1200" }
}
}
}
]
).pretty()
Resultado:
{ "utcOffset-1000" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 13, "minute" : 30, "second" : 15, "millisecond" : 123 }, "utcOffset+1200" : { "year" : 2021, "month" : 1, "day" : 1, "hour" : 11, "minute" : 30, "second" : 15, "millisecond" : 123 } }
Partes da data da semana ISO
Você pode usar
iso8601: true
para modificar o documento de saída para usar os campos de data da semana ISO. Isso baseia a data no padrão ISO 8601. Suponha que tenhamos uma coleção chamada
cats
com o seguinte documento:{ "_id" : ObjectId("6008c9a5c8eb4369cf6ad9cc"), "name" : "Scratch", "born" : ISODate("2021-01-03T23:30:15.123Z") }
Podemos executar o seguinte código para extrair os campos de data ISO do
born
campo nesse documento. Segue um exemplo para demonstrar:
db.pets.aggregate(
[
{
$project: {
_id: 0,
dateParts: {
$dateToParts: {
date: "$born"
}
},
datePartsISO: {
$dateToParts: {
date: "$born",
iso8601: true
}
}
}
}
]
).pretty()
Resultado:
{ "dateParts" : { "year" : 2020, "month" : 12, "day" : 31, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 }, "datePartsISO" : { "isoWeekYear" : 2020, "isoWeek" : 53, "isoDayOfWeek" : 4, "hour" : 23, "minute" : 30, "second" : 15, "millisecond" : 123 } }
O primeiro documento de saída usa a saída de data normal. O segundo documento usa os campos e valores de data da semana ISO.
Retorne as partes da data de um ObjectId
Você pode usar
$dateToParts
para retornar as partes de data de um ObjectId. Os valores ObjectId são valores hexadecimais de 12 bytes que consistem em:
- Um valor de carimbo de data/hora de 4 bytes, representando a criação do ObjectId, medido em segundos desde a época do Unix.
- Um valor de 5 bytes é aleatório
- Um contador de incremento de 3 bytes, inicializado com um valor aleatório.
Para recapitular, nosso documento se parece com isso:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "name" : "Fetch", "born" : ISODate("2020-12-31T23:30:15.123Z") }
Este documento contém um ObjectId. Podemos, portanto, usar
$dateToParts
para retornar as partes da data, com base na data em que nosso documento foi criado (ou mais especificamente, quando o _id
valor ObjectId do campo foi criado). Exemplo:
db.pets.aggregate(
[
{
$project:
{
"timeStamp": { $toDate: "$_id"},
"dateParts": { $dateToParts: { date: "$_id" } }
}
}
]
).pretty()
Resultado:
{ "_id" : ObjectId("600631c7c8eb4369cf6ad9c8"), "timeStamp" : ISODate("2021-01-19T01:11:35Z"), "dateParts" : { "year" : 2021, "month" : 1, "day" : 19, "hour" : 1, "minute" : 11, "second" : 35, "millisecond" : 0 } }
Nesse caso, também usei o
$toDate
operador de pipeline de agregação para retornar a parte de carimbo de data/hora do ObjectId.