Декодер ObjectId и ObjectId по дате
Вставьте ObjectId — идентификатор из 24 символов, который MongoDB записывает в _id, — и узнайте, когда он создан и что хранят его остальные части. Во втором блоке введите дату: получится наименьший ObjectId этой секунды, готовый для запроса документов, созданных после неё.
Работает в браузере: всё, что вы вводите, никуда не отправляется.
Как пользоваться
- Вставьте ObjectId в первое поле. Ниже появятся время создания, секунды Unix, случайное значение и счётчик.
- Для обратного направления введите дату во втором блоке: получите ObjectId и готовый запрос по _id.
- Скопируйте нужное кнопками копирования.
Как это работает
Первые 8 шестнадцатеричных цифр — время создания в секундах с 1970-01-01 UTC, старшим байтом вперёд. Следующие 10 цифр — случайное значение процесса, последние 6 — счётчик.
Для даты инструмент берёт её секунды Unix (доли отбрасываются), записывает их 8 шестнадцатеричными цифрами и добавляет 16 нулей. Ни один настоящий идентификатор этой секунды не меньше, поэтому он подходит как граница диапазона.
Пример
507f1f77bcf86cd799439011:
- 507f1f77 в десятичной записи — 1 350 508 407 секунд, то есть 2012-10-17T21:13:27Z;
- bcf86cd799 — случайное значение;
- 439011 — счётчик: 4 427 793 в десятичной записи.
В обратную сторону: 2026-01-01T00:00:00Z — это 1 767 225 600 секунд = 6955b900 в шестнадцатеричной записи, значит, ObjectId — 6955b9000000000000000000.
Советы
- Сортировка по _id — это примерно сортировка по времени создания, но только до секунды; идентификаторы разных процессов в одну секунду по времени не упорядочены.
- Чтобы прочитать время в коде, в mongosh есть
ObjectId("…").getTimestamp().
- Для UUID есть декодер UUID, для идентификаторов Twitter и Discord — декодер Snowflake ID.
Частые вопросы
Что внутри ObjectId?
12 байт, записанных 24 шестнадцатеричными цифрами: 4 байта Unix-времени в секундах, 5 байт случайного значения, выбранного один раз на процесс, и 3-байтовый счётчик, который начинается со случайного числа и растёт на единицу с каждым новым идентификатором.
Время создания точное?
С точностью до секунды и по часам той машины или драйвера, которые создали идентификатор. Обычно ObjectId создаёт клиентский драйвер, так что это часы клиента, а не сервера базы данных.
Как найти документы, созданные после даты?
Возьмите ObjectId этой даты как нижнюю границу: db.orders.find({ _id: { $gte: ObjectId("…") } }). Время стоит в начале, поэтому ObjectId сортируются по секунде создания, а созданный по дате идентификатор (время и 16 нулей) — наименьший в этой секунде.
Можно ли узнать по ObjectId компьютер или процесс?
Уже нет. В старых версиях формата были идентификаторы машины и процесса, в нынешней — случайное 5-байтовое значение на процесс, по которому видно только, пришли ли два идентификатора, скорее всего, из одного процесса.
Можно вставить ObjectId("…")?
Да, обёртка ObjectId("…") из консоли убирается, регистр букв не важен.