
ObjectId против UUID: как выбор _id в MongoDB влияет на API, индексы и миграции
alwaysdeterminated 6 минут назад ObjectId против UUID: как выбор _id в MongoDB влияет на API, индексы и миграции Средний 5 мин 26 MongoDB * Базы данных * Программирование * Серверная оптимизация * В MongoDB легко не...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Значимый прорыв формирует отрасль ИИ: alwaysdeterminated 6 минут назад ObjectId против UUID: как выбор _id в MongoDB влияет на API, индексы и миграции Средний 5 мин 26 MongoDB * Базы данных * Программирование * Серверная оптимизация * В MongoDB легко не думать про _id. insertOne({ name: "Mikhail" })MongoDB добавит его сама и будет использовать как первичный ключ документа:{ _id: ObjectId("665f2a3c7b3d4e6f8a901234 name: "Mikhail" }И долгое время этого может быть достаточно. Документы создаются, запросы работают, индекс по _id создается вместе с коллекцией.
Проблемы начинаются позже — когда ID попадает в публичный API, события, другие сервисы, миграции или ссылки между системами. В этот момент _id перестаёт быть внутренней технической деталью и становится частью архитектуры. Чаще всего выбор выглядит так:ObjectId — дефолт MongoDB.
Технические детали
UUID — стандартный внешний идентификатор. Но на практике важен не только формат ID. Важны размер, порядок вставки в индекс, переносимость, публичность и то, как именно значение хранится в BSON.
_id кажется мелочью, пока не становится частью API, индексов и миграций. Что такое ObjectId на практикеВнутри ObjectId всего 12 байт: 4 байта на timestamp, 5 байт рандомного значения и 3 байта счетчика. Поэтому значения обычно растут по времени создания:ObjectId("665f2a3c7b3d4e6f8a901234 ObjectId("665f2a3d7b3d4e6f8a901235 ObjectId("665f2a3e7b3d4e6f8a901236 Это удобно для индекса: новые документы попадают ближе к концу дерева, а не распределяются по нему случайно.
Но есть два важных ограничения. Первое: ObjectId не заменяет created_at. В нём действительно есть timestamp, и его можно получить:ObjectId("665f2a3c7b3d4e6f8a901234 .
Отраслевые последствия
getTimestamp()Но порядок только приблизительный. ObjectId хранит время с точностью до секунд, а если генерация происходит на разных клиентах, то остается только молиться, чтобы системные часы были одинаковыми. Поэтому лучше позаботиться об отдельном поле, которое будет одновременно и читаемым, и практичным:{ _id: ObjectId("665f2a3c7b3d4e6f8a901234 created_at: ISODate("2026-06-08T10:15:00Z }Второе: ObjectId — не секрет.
Если отдавать его наружу, то по нему можно извлечь примерное время создания документа. Это не делает ObjectId опасным сходу, но его не стоит использовать как reset-token, invite-token или любой другой token, где важна непредсказуемость. UUID: важна не только версия, но и способ храненияКогда говорят “давайте использовать UUID”, обычно имеют в виду UUIDv4:550e8400-e29b-41d4-a716-446655440000Он хорошо подходит для распределённых систем: его можно генерировать в приложении, передавать между сервисами, использовать в событиях, логах и других базах.
Но в MongoDB UUID лучше хранить не строкой.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




