A la hora de extraer el día de una fecha, la opción exacta que utilicemos dependerá de cómo queramos que se represente el día.
Por ejemplo, ¿queremos el día de la semana, el día del mes o el día del año? ¿O tal vez lo queremos en formato ISO 8601? El valor de retorno normalmente será diferente dependiendo de cuál elijamos.
Este artículo explora esas opciones y, por lo tanto, presenta 8 formas de devolver la parte del día de una fecha en MongoDB.
Datos de muestra
Supongamos que tenemos una colección llamada cats
con los siguientes 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") }
Los siguientes ejemplos muestran varias opciones para devolver la parte del día del born
campo de esos documentos.
El $dayOfWeek
Operador
Como su nombre lo indica, el $dayOfWeek
operador devuelve el día de la semana a partir de una fecha.
Podemos ejecutar el siguiente código para devolver el día de la semana del born
campo en el documento anterior.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfWeek: { $dayOfWeek: "$born" }
}
}
]
)
Resultado:
{ "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 1 } { "birthDayOfWeek" : 5 }
También es posible especificar la zona horaria al usar $dayOfWeek
operador.
Ver MongoDB $dayOfWeek
para más información y ejemplos.
El $dayOfMonth
Operador
El $dayOfMonth
operador devuelve el día del mes a partir de una fecha.
Ejemplo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfMonth: { $dayOfMonth: "$born" }
}
}
]
)
Resultado:
{ "birthDayOfMonth" : 3 } { "birthDayOfMonth" : 8 } { "birthDayOfMonth" : 24 }
También puede especificar la zona horaria al usar el $dayOfMonth
operador.
Ver MongoDB $dayOfMonth
para más información y ejemplos.
El $dayOfYear
Operador
Sí, lo has adivinado. El $dayOfYear
operador devuelve el día del año a partir de una fecha.
Ejemplo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthDayOfYear: { $dayOfYear: "$born" }
}
}
]
)
Resultado:
{ "birthDayOfYear" : 3 } { "birthDayOfYear" : 342 } { "birthDayOfYear" : 268 }
El $dayOfYear
el operador también acepta un parámetro de zona horaria.
Ver MongoDB $dayOfYear
para más información y ejemplos.
El $dateToString
Operador
El $dateToString
El operador convierte un objeto de fecha en una cadena de acuerdo con un formato especificado por el usuario. Por lo tanto, el usuario puede especificar que solo se devuelva la parte del día si es necesario.
Hay especificadores de formato para cada parte de la fecha y, cuando se trata de la parte del día, puede elegir entre los especificadores de formato que dependerán de si desea devolver el día de la semana, el día del mes, el día del año o el día de la semana en formato ISO 8601.
Ejemplo:
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" }
Podríamos haber proporcionado más especificadores de formato para incluir otras partes de la fecha en el resultado, pero como solo estamos interesados en extraer el día en este artículo, solo usamos especificadores de formato para devolver la parte del día.
Ver MongoDB $dateToString
para más información y ejemplos.
Ver también MongoDB $dateToString
Especificadores de formato para obtener una lista de especificadores de formato que puede usar con $dateToString
.
El $dateToParts
Operador
El $dateToParts
El operador devuelve un documento que contiene las partes constituyentes de un valor de fecha BSON dado como propiedades individuales. Las propiedades devueltas son year
, month
, day
, hour
, minute
, second
y millisecond
.
Por lo tanto, podemos usar $dateToParts
en una etapa de canalización, luego agregue otra etapa de canalización que extraiga el day
parte si es necesario.
Esto es lo que $dateToParts
devoluciones de nuestros tres 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 } }
Estos datos se pueden pasar a la siguiente etapa de la canalización para extraer solo el day
campo.
Esto es lo que sucede si agregamos otra proyección solo para el day
campo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthDay: "$dateParts.day"
}
}
]
)
Resultado:
{ "birthDay" : 3 } { "birthDay" : 8 } { "birthDay" : 24 }
Obviamente, esto no es tan conciso como usar las opciones anteriores. Sin embargo, dependiendo de lo que esté haciendo en su embudo, este enfoque podría ser una opción.
También vale la pena mencionar que $dateToParts
acepta un iso8601
parámetro, que modifica el documento de salida para usar campos de fecha de semana ISO.
Ver MongoDB $dateToParts
para más información y ejemplos.
El forEach()
Método
Puedes usar cursor.forEach()
para iterar a través del cursor, usando un método de JavaScript para devolver solo el valor del día.
db.cats.find().forEach(
function(c) {
print(
c.born.getDay()
);
}
);
Resultado:
1 0 4
En este caso, usamos JavaScript getDay()
método, que devuelve un número entero, entre 0 y 6, correspondiente al día de la semana para la fecha dada, según la hora local.
Otra opción es usar el getUTCDay()
método, que utiliza el tiempo universal. Usaremos este método en el siguiente ejemplo.
Alternativamente, podríamos haber usado JavaScript getDate()
método, que devuelve un número entero, entre 1 y 31, que representa el día del mes para la fecha dada.
Además, esta opción devuelve solo el valor del día real y no el documento completo, como en los ejemplos anteriores.
El map()
Método
El cursor.map()
El método aplica una función a cada documento visitado por el cursor y combina los valores en una matriz.
Ejemplo:
db.cats.find().map(
function(c) {
c = c.born.getUTCDay();
return c;
}
);
Resultado:
[ 0, 0, 4 ]
Como se mencionó, JavaScript getUTCDay()
método devuelve su resultado utilizando el tiempo universal. En este caso, se devolvió un valor diferente para el primer documento (obtuvimos 0
en este ejemplo, frente a 1
en el anterior).
El $isoDayOfWeek
Operador
Si necesita devolver el día de la semana en formato ISO 8601, puede usar $isoDayOfWeek
. El año ISO 8601 comienza el lunes de la semana 1 y finaliza el domingo de la última semana.
Ejemplo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthIsoDayOfWeek: { $isoDayOfWeek: "$born" }
}
}
]
)
Resultado:
{ "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 7 } { "birthIsoDayOfWeek" : 4 }
En este caso, obtenemos un resultado completamente diferente al que obtuvimos cuando usamos $dayOfWeek
operador, debido a la forma en que ISO 8601 calcula las fechas.
Aquí hay un ejemplo que demuestra esta diferencia:
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 }