Что такое MongoDB ObjectId?

MongoDB ObjectId — это уникальный идентификатор длиной 12 байт (24 шестнадцатеричных символа), используемый в качестве значения поля _id по умолчанию для каждого документа в коллекции MongoDB. Его структура не является случайной — она кодирует значимую информацию. Первые четыре байта хранят Unix-временную метку, соответствующую секунде создания ObjectId. Оставшиеся байты содержат случайное значение и инкрементный счётчик, гарантирующий уникальность даже при вставке нескольких документов в одну и ту же секунду на одной машине.

Поскольку временная метка создания встроена непосредственно в идентификатор, можно точно определить, когда был создан документ, без необходимости хранить отдельное поле createdAt.

Как встроена временная метка

ObjectId вида 507f1f77bcf86cd799439011 расшифровывается следующим образом:

Байты Шестнадцатеричные символы Назначение
1–4 507f1f77 Unix-временная метка (секунды с начала эпохи)
5–9 bcf86cd799 Случайное значение (уникальное для машины/процесса)
10–12 439011 Инкрементный счётчик

Преобразование первых восьми шестнадцатеричных символов 507f1f77 в десятичное число даёт 1350844279, что соответствует 2012-10-21T21:17:59.000Z.

Описание инструмента

Этот инструмент извлекает встроенную временную метку из любого корректного MongoDB ObjectId и отображает её в нескольких форматах даты. Вставьте ObjectId и мгновенно получите дату в формате ISO 8601, дату в UTC, локальную дату и необработанную Unix-временную метку — без подключения к базе данных и написания кода.

Примеры

Входной ObjectId Извлечённая дата (UTC)
507f1f77bcf86cd799439011 2012-10-21T21:17:59.000Z
65a1fc2b0000000000000000 2024-01-13T04:44:27.000Z
000000000000000000000000 1970-01-01T00:00:00.000Z

Возможности

  • Мгновенное извлечение: результаты отображаются по мере ввода — нажимать кнопки не нужно
  • Несколько форматов: отображаются ISO 8601, UTC, локальные дата и время, а также Unix-временная метка
  • Валидация ввода: отклоняет всё, что не является корректной шестнадцатеричной строкой из 24 символов
  • Без зависимостей: работает полностью в браузере без обращений к серверу и внешних библиотек
  • Готовый к копированию вывод: каждое поле вывода можно скопировать отдельно

Сценарии использования

  • Отладка: быстро проверить, когда был вставлен документ, без запроса к базе данных
  • Аудит: проверить временные метки создания в экспортированных списках ObjectId или лог-файлах
  • Расследование инцидентов: определить возраст записей при миграции данных или анализе инцидентов

Принцип работы

  1. Инструмент берёт первые 8 шестнадцатеричных символов ObjectId.
  2. Разбирает их как 32-битное целое число в формате big-endian для получения Unix-временной метки в секундах.
  3. Умножает на 1000 и передаёт в объект JavaScript Date.
  4. Форматирует полученную дату в ISO 8601, UTC-строку, строку с учётом локали и необработанные секунды.

Ограничения

  • Извлекается только временная метка создания. Случайная часть и счётчик ObjectId не декодируются, поскольку не несут значимых для пользователя данных.
  • ObjectId, сгенерированные с пользовательской или нулевой временной меткой, вернут корректную, но потенциально вводящую в заблуждение дату.
  • Формат локальной даты зависит от настроек локали вашего браузера.

Часто задаваемые вопросы

Можно ли извлечь дату из любого MongoDB ObjectId? Да. Каждый стандартный MongoDB ObjectId — независимо от того, был ли он сгенерирован драйвером MongoDB, Mongoose, mongosh или такими инструментами, как Faker.js, — содержит корректную временную метку в первых четырёх байтах.

Это то же самое, что поле createdAt? Только если ObjectId был сгенерирован в момент вставки (поведение по умолчанию). Если ObjectId был задан вручную, встроенная временная метка может отличаться от фактического времени создания.

Работает ли это с ObjectId из старых версий MongoDB? Да. 4-байтовый префикс временной метки является частью спецификации ObjectId с момента первого выпуска MongoDB. Единственное изменение со временем коснулось средних байтов (идентификатор машины вместо случайного значения), которые этот инструмент не декодирует.