MongoDB proporciona una serie de operadores de canalización de agregación para trabajar con fechas, incluidos los operadores que extraen ciertas partes de las fechas, como el año, el mes, el día, etc.
También hay un par de métodos de MongoDB que le permiten iterar a través de un cursor y aplicar una función de JavaScript. Por lo tanto, puede usar JavaScript para extraer valores de fecha y partes de fecha, etc. de un campo según sea necesario.
Este artículo presenta 5 formas de devolver la parte del mes 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 mes del born
campo de esos documentos.
El $month
Operador
El $month
El operador está diseñado específicamente para devolver un documento con la parte del mes de una fecha determinada.
Podemos ejecutar el siguiente código para devolver el mes desde el born
campo en el documento anterior.
db.cats.aggregate(
[
{
$project:
{
_id: 0,
birthMonth: { $month: "$born" }
}
}
]
)
Resultado:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
También puede especificar la zona horaria al usar el $month
operador.
Ver MongoDB $month
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 mes si es necesario.
Hay especificadores de formato para cada parte de la fecha. El %m
especificador de formato devuelve el mes.
Ejemplo:
db.cats.aggregate(
[
{
$project: {
_id: 0,
birthMonth: { $dateToString: { format: "%m", date: "$born" } }
}
}
]
)
Resultado:
{ "birthMonth" : "01" } { "birthMonth" : "12" } { "birthMonth" : "09" }
Podríamos haber proporcionado más especificadores de formato para incluir partes de fecha en el resultado, pero dado que solo estamos interesados en extraer el mes en este artículo, solo usamos un especificador de formato.
Ver MongoDB $dateToString
para más información y ejemplos.
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, podríamos usar $dateToParts
en una etapa de canalización, luego agregue otra etapa de canalización que extraiga el month
parte.
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 } }
Este resultado se puede pasar a la siguiente etapa de la canalización para extraer solo el month
campo.
Esto es lo que sucede si agregamos otra proyección solo para el month
campo:
db.cats.aggregate(
[
{
$project:
{
_id: 0,
dateParts: { $dateToParts: { date: "$born" } }
}
},
{
$project:
{
birthMonth: "$dateParts.month"
}
}
]
)
Resultado:
{ "birthMonth" : 1 } { "birthMonth" : 12 } { "birthMonth" : 9 }
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 adecuado.
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 como getMonth()
o getUTCMonth()
para devolver solo el valor del mes.
db.cats.find().forEach(
function(c) {
print(
c.born.getMonth()
);
}
);
Resultado:
0 11 8
Tenga en cuenta que getMonth()
El método de JavaScript devuelve el número del mes como un número entero, entre 0 y 11.
También puede notar que las opciones anteriores devuelven un documento completo que contiene un par de nombre/valor, mientras que esta opción devuelve solo el valor del mes real, y no el documento completo.
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.getMonth();
return c;
}
);
Resultado:
[ 0, 11, 8 ]
De nuevo, obtenemos los meses como números enteros entre 0 y 11.