ObjectId de MongoDB a fecha
Todo ObjectId de MongoDB empieza con el segundo en el que se creó. Pega uno o varios ObjectIds para ver sus fechas de creación en UTC y en hora local, o elige una fecha para obtener los límites de ObjectId correspondientes para consultas rápidas por rango de _id.
Última actualización:
De ObjectId a fecha
De fecha a ObjectId
Cómo usar ObjectId de MongoDB a fecha
- Pega un ObjectId en el decodificador, con o sin el envoltorio ObjectId("…").
- Consulta la hora de creación en UTC, en tu zona horaria local y como timestamp Unix, además del contador y la parte aleatoria.
- Decodifica muchos a la vez pegando un ObjectId por línea; la herramienta muestra cada uno con su fecha y te permite descargar un CSV.
- Haz la conversión inversa: elige una fecha y una hora (local o UTC) para obtener el ObjectId más pequeño de ese segundo.
- Crea una consulta por rango añadiendo una fecha de fin y copia la consulta
find()generada en mongosh o en tu driver.
Estructura del ObjectId
Un ObjectId de MongoDB tiene 12 bytes y se muestra como 24 caracteres hexadecimales. Ejemplo: 507f1f77bcf86cd799439011.
| Bytes | Caracteres hex | Campo | En el ejemplo |
|---|---|---|---|
| 0-3 | 1-8 | Timestamp: segundos desde la época Unix, big-endian | 507f1f77 = 1350508407 = 2012-10-17 21:13:27 UTC |
| 4-8 | 9-18 | Valor aleatorio, único por máquina y proceso (drivers antiguos: id de máquina de 3 bytes + id de proceso de 2 bytes) | bcf86cd799 |
| 9-11 | 19-24 | Contador, que empieza en un valor aleatorio y se incrementa con cada nuevo ObjectId | 439011 = 4427793 |
Obtener el timestamp en código
| Entorno | Código |
|---|---|
| mongosh | ObjectId("507f1f77bcf86cd799439011").getTimestamp() |
| Agregación | { $toDate: "$_id" } o { $convert: { input: "$_id", to: "date" } } |
| JavaScript | new Date(parseInt(id.slice(0, 8), 16) * 1000) |
| Python (bson) | ObjectId(id).generation_time |
| Python (sin librerías) | datetime.fromtimestamp(int(id[:8], 16), timezone.utc) |
| Java | new ObjectId(id).getDate() |
Consultar por fecha sin un campo createdAt
Como el timestamp es la parte más significativa del valor, los ObjectIds se comparan en orden temporal. Un ObjectId formado por un timestamp seguido de dieciséis ceros es el id más pequeño posible para ese segundo, así que {_id: {$gte: ObjectId(startHex + "0000000000000000"), $lt: ObjectId(endHex + "0000000000000000")}} devuelve todos los documentos cuyo id se creó en ese intervalo, usando el índice _id predeterminado. Recuerda que el límite está en segundos UTC; si eliges una hora local arriba, la herramienta la convierte a UTC antes de crear el id.
Preguntas frecuentes
¿Cómo obtengo el timestamp de un ObjectId de MongoDB?
Toma los primeros 8 caracteres hexadecimales y conviértelos de hexadecimal a decimal: esa es la hora de creación en segundos desde el 1 de enero de 1970 UTC. Para 507f1f77bcf86cd799439011, 507f1f77 = 1350508407, que es el 17 de octubre de 2012, 21:13:27 UTC. En mongosh puedes llamar a ObjectId("…").getTimestamp().
¿Qué contiene un ObjectId de MongoDB?
Un ObjectId tiene 12 bytes: un timestamp big-endian de 4 bytes en segundos, un valor aleatorio de 5 bytes generado una vez por proceso y un contador de 3 bytes que empieza en un valor aleatorio y se incrementa. Los drivers anteriores a MongoDB 3.4 usaban un identificador de máquina de 3 bytes más un id de proceso de 2 bytes en lugar del valor aleatorio de 5 bytes.
¿Cómo consulto documentos de MongoDB por fecha de creación usando _id?
Crea un ObjectId cuyo timestamp sea tu fecha de inicio y cuyos otros 16 dígitos hexadecimales sean ceros, y luego consulta {_id: {$gte: ObjectId(start), $lt: ObjectId(end)}}. Como _id siempre está indexado, es rápido incluso sin un campo createdAt aparte. El generador de esta página escribe la consulta por ti.
¿Es preciso el timestamp del ObjectId?
Tiene precisión de un segundo y procede del reloj de la máquina que creó el ObjectId, que normalmente es el servidor de la aplicación y no la base de datos. Los ObjectIds también pueden venir de los clientes, así que toma la hora como el momento en que se generó el id, no como prueba de cuándo se insertó un documento.
¿Los ObjectIds se pueden ordenar por tiempo?
Aproximadamente. Ordenar por _id ordena los documentos por segundo de creación, pero los ObjectIds creados en el mismo segundo en máquinas distintas se ordenan por su valor aleatorio, no por el orden exacto de creación.
¿Cuándo se agotarán los timestamps de ObjectId?
El timestamp de 4 bytes sin signo puede representar fechas hasta el 7 de febrero de 2106, 06:28:15 UTC. MongoDB trata el campo como sin signo, así que no hay problema del año 2038.
¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?
Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.