Генерируется ли MongoDB _id (ObjectId) в порядке возрастания?

Я знаю, как столбец _id содержит представление временной метки, когда документ был вставлен в коллекцию. вот онлайн-утилита для преобразования его в метку времени: http://steveridout.github.io/mongo-object-time/

Мне интересно, гарантируется ли сама строка идентификатора объекта в порядке возрастания или нет? то есть всегда ли это сравнение возвращает true?

"newest object id" > "second newest object id"


person Zahra    schedule 25.06.2015    source источник
comment
Подождите, вы имеете в виду порядок вставки или просто порядок создания _id?   -  person Sammaye    schedule 25.06.2015


Ответы (3)


Нет, никакой гарантии нет. Из официальной документации (по адресу время исходного ответа):

Связь между порядком значений ObjectId и временем генерации не ограничивается одной секундой. Если несколько систем или несколько процессов или потоков в одной системе генерируют значения в течение одной секунды; Значения ObjectId не представляют строгий порядок размещения. Перекос часов между клиентами также может привести к нестрогому порядку даже для значений, поскольку клиентские драйверы генерируют значения ObjectId, а не процесс mongod.

И из последних документов< /а>

Хотя значения ObjectId должны увеличиваться со временем, они не обязательно должны быть монотонными. Это потому, что они:

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

person zero323    schedule 25.06.2015
comment
Спасибо за ссылку. Получается, что это в порядке возрастания в более широком временном диапазоне, но не в порядках меньше секунды. - person Zahra; 25.06.2015
comment
Ну, я был бы осторожен, в худшем случае более широкий временной диапазон может быть очень широким. Рассмотрим сценарий, когда вы вставляете документ, устанавливаете системные часы на 1 января 1970 года и вставляете еще один. - person zero323; 25.06.2015
comment
Итак... если ObjectId генерируется на одной машине, то я могу предположить, что они находятся в порядке возрастания? - person Liu Wenzhe; 02.08.2018

_id: ObjectId (4 байта временной метки, 3 байта идентификатора машины, 2 байта идентификатора процесса, 3 байта инкрементатора)

Это структура идентификатора. Таким образом, только последние 3 байта будут увеличиваться однозначно. Так что ответ на ваш вопрос - да.

person suleman ravla    schedule 25.06.2015
comment
так что ваш ответ частично верен, однако с учетом ответа выше он почти по возрастанию, но не строго, поскольку байты метки времени имеют более высокое значение, и он может быть не в порядке в масштабах менее 1 секунды. - person Zahra; 25.06.2015

Для mongo version >= 3.4 немного изменена генерация Objectid. Его структуры:

  • 4-байтовое значение, представляющее секунды с эпохи Unix,
  • 5-байтовое случайное значение и
  • 3-байтовый счетчик, начиная со случайного значения.

Таким образом, первые 4 байта - это все еще секунды с эпохи Unix, они все еще почти возрастают, но не строго.

https://docs.mongodb.com/manual/reference/bson-types/#objectid

person YongHao Hu    schedule 11.12.2018