Создан ли MongoDB _id (ObjectId) в порядке возрастания?
Я знаю, как столбец _id содержит представление метки времени, когда документ был вставлен в коллекцию. здесь используется онлайн-утилита для преобразования ее в метку времени: http://steveridout.github.io/mongo-object-time/
Что мне интересно, если сама строка идентификатора объекта гарантированно поддерживает восходящий порядок или нет? т.е. всегда ли это сравнение возвращает true?
"newest object id" > "second newest object id"
Ответы
Ответ 1
Нет, нет никакой гарантии. Из официальной документации :
Связь между порядком значений ObjectId и временем генерации не является строгой в течение одной секунды. Если несколько систем или несколько процессов или потоков в одной системе генерируют значения за одну секунду; Значения ObjectId не представляют строгий порядок вставки. Перекос часов между клиентами также может привести к нестандартному упорядочению даже для значений, поскольку драйверы клиента генерируют значения ObjectId, а не процесс mongod.
Ответ 2
_id: ObjectId (временная метка 4 байта, идентификатор машины 3 байта, идентификатор процесса 2 байта, инкремент с 3 байтами)
Это структура id. Таким образом, только последние 3 байта будут увеличиваться однозначно. Поэтому ответ на ваш вопрос - да.
Ответ 3
Для mongo version >= 3.4
поколение Objectid немного изменилось. Его структуры:
- 4-байтовое значение, представляющее секунды с начала эпохи Unix,
- 5-байтовое случайное значение и
- 3-байтовый счетчик, начиная со случайного значения.
Таким образом, первые 4 байта все еще являются секундами со времени эпохи Unix, они все еще почти восходят, но не строго.
https://docs.mongodb.com/manual/reference/bson-types/#objectid