HOWTO · MongoDB

Almacenar fecha y hora en MongoDB

Aprende a distinguir `Date()` de `new Date()` en MongoDB: `Date()` devuelve una cadena, mientras que `new Date()` crea un valor de fecha que puede almacenarse como BSON Date. La guía también muestra cómo consultar intervalos de fechas con `ISODate()`, ordenar fechas con `sort()` y diagnosticar resultados inesperados.

En esta página

Para almacenar una fecha en MongoDB, pasa un valor JavaScript Date, creado normalmente con new Date(). En mongosh, Date() sin new devuelve una cadena; no crea un valor de fecha para un documento. Esta guía explica la diferencia, muestra una consulta por intervalo de fechas con ISODate() y aborda la ordenación cronológica y sus problemas habituales.

Usar Date() y new Date() en MongoDB

Date() devuelve la fecha y la hora actuales como una cadena. Usa new Date() cuando necesites un valor JavaScript Date que MongoDB pueda almacenar como BSON Date. Para representar un instante fijo, pasa una marca de tiempo ISO 8601 con un indicador UTC explícito, como Z:

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

console.log(new Date("2024-06-01T12:00:00Z").toISOString());
2024-06-01T12:00:00.000Z

Este ejemplo de JavaScript muestra únicamente cómo construir un valor de fecha; las operaciones de MongoDB requieren una sesión de mongosh. En una inserción o actualización, usa directamente el valor; por ejemplo, db.products.insertOne({ item: "apple", dateAdded: new Date() }). El documento almacena un valor BSON Date en dateAdded, no la cadena que devuelve Date().

Consultar y ordenar fechas en MongoDB

Puedes ordenar un campo de fecha en cualquiera de los dos sentidos con sort(): usa 1 para el orden ascendente (primero las fechas anteriores) y -1 para el descendente (primero las fechas posteriores). Por ejemplo, db.posts.find().sort({ date: 1 }) ordena posts por el campo date, de la fecha más antigua a la más reciente, mientras que db.posts.find().sort({ date: -1 }) devuelve el orden inverso. Estas consultas presuponen que los valores del campo se almacenan de forma uniforme como fechas.

Una cadena con apariencia de fecha ISO sigue siendo una cadena. Si un campo contiene tanto cadenas como valores BSON Date, MongoDB ordena primero según el orden de los tipos BSON y luego por el valor dentro de cada tipo; por eso, el resultado podría no ser cronológico entre todos los documentos. Para ordenar fechas de forma fiable, normaliza los valores del campo a BSON Date y usa el mismo nombre de campo y sentido de ordenación en la consulta.

Si los resultados parecen desordenados, comprueba que la consulta se dirija a la colección prevista, que la clave de ordenación coincida con el nombre del campo almacenado, que los valores usen de manera uniforme el tipo BSON Date y que la dirección sea 1 o -1, según corresponda. Una colección contiene documentos; cada documento contiene el campo de fecha.

Usar ISODate() en consultas de fechas de MongoDB

ISODate() es una función auxiliar de mongosh que se usa para representar un valor de fecha en ejemplos de la shell; no es un tipo BSON independiente. Úsala para expresar los límites de fecha de una consulta. El siguiente ejemplo busca documentos cuya AdmissionDate va desde la medianoche UTC del 7 de junio de 2013 (incluida) hasta la medianoche UTC del 8 de junio (excluida):

db.students.find({ AdmissionDate: { $gte: ISODate("2013-06-07T00:00:00Z"), $lt: ISODate("2013-06-08T00:00:00Z") } })

$gte incluye el instante inicial y $lt excluye el instante final, de modo que dos intervalos diarios consecutivos no incluyan dos veces el mismo instante. Mantén coherentes el nombre del campo de la consulta y el campo BSON Date almacenado.

Estos fragmentos de mongosh son ilustrativos y no se presentan como resultados de ejecución. Ejecútalos en una shell de MongoDB conectada a una base de datos que contenga la colección y los campos indicados; los resultados de find() dependen de esos datos.

Conclusión

Usa new Date() para almacenar un valor de fecha y recuerda que Date() devuelve una cadena. Consulta los campos de fecha con límites ISODate() en mongosh y ordena los valores BSON Date de tipo uniforme con sort(). Si la ordenación no es la esperada, verifica el nombre del campo, los tipos BSON y el sentido de ordenación.