Автогенерированный идентификатор BSON, который хранится в поле _id каждого документа, является ли он идентификатором GUID? В документации говорится, что она "скорее всего уникальна", поэтому я немного смущен. Зачем им использовать идентификатор, который не является уникальным?
Являются ли идентификаторы GUID Mongodb ObjectIds?
Ответ 1
Его единственность основана на вероятности. В отличие от ответа @mattexx:
Это не "гарантировано", чтобы быть уникальным, потому что MongoDB не обеспечивает уникальность для экономии времени.
MongoDB Устанавливает uniqness на ObjectId
, он фактически имеет уникальный индекс в поле _id
. Говоря об экономии времени, ObjectId
имеет исторический характер, так как он был разработан в дни, когда MongoDB не делал никаких записей и нуждался в 99% вероятности вставить новую уникальную запись без клиента, ожидающего ack (ObjectIds создаются с клиентской стороны).
Они не являются GUID, однако они, как говорит @Asya, гарантируют высокий уровень uniqness.
Пока время не движется назад, все равно шанс на 99% будет уникальным навсегда. Хорошо, как говорит @Devesh, есть 1, 1 триллион ( "не сделали математику" ), шанс дублирования GUID, но, опять же, я не думаю, что вы скоро достигнете этой вероятности.
Ответ 2
Он уникален в большинстве требований и состоит из отметки времени, уникального идентификатора машины (хеш машинного узла), идентификатора процесса и последнего номера инкремента. http://docs.mongodb.org/manual/reference/object-id/
Ответ 3
Вероятность столкновения с идентификатором теоретически достаточно близко к нулю, что можно предположить для типичных веб-приложений. Многие системы реального мира (Mongo или нет) полагаются на это свойство GUID, хотя это не будет хорошим предположением для систем безопасности/критически важных систем.
В практических условиях действительно существуют сценарии, где это может пойти не так, если возникла неправильная конфигурация или ошибка библиотеки сторонних разработчиков. Те не должны исключать эту концепцию, но важно знать об этих рисках и избегать их там, где это возможно.
Некоторый хороший анализ здесь практических вопросов, которые могут вызвать столкновение. В частности:
Некоторые драйверы Mongo используют случайные числа вместо увеличения чисел для байтов счетчика. В этих случаях существует вероятность получения уникального идентификатора 1/16,777,216, но только если эти два идентификатора генерируются за одну секунду (т.е. До временного раздела обновлений ID до следующей секунды), на том же машина в том же процессе.
Ответ 4
ObjectId объясняется в документе здесь. Он не "гарантирован" быть уникальным, потому что MongoDB не обеспечивает уникальность, чтобы сэкономить время. Он просто полагает, что алгоритм сложного генерации, вероятно, никогда не будет создавать два идентичных объекта ObjectIds в одном хранилище данных. Так что технически это не GUID, но в значительной степени хороший.