Создан ли 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