MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Възможно ли е да се генерира дубликат на Mongo ObjectId в две различни колекции?

Кратък отговор

Само за да добавите директен отговор на първоначалния ви въпрос:ДА, ако използвате генериране на BSON Object ID, то за повечето драйвери идентификаторите почти сигурно ще бъдат уникални в колекциите. Вижте по-долу какво означава „почти сигурно“.

Дълъг отговор

Идентификаторите на BSON обект, генерирани от драйверите на Mongo DB, е много вероятно да бъдат уникални в колекциите. Това се дължи главно на последните 3 байта от идентификатора, които за повечето драйвери се генерира чрез статичен нарастващ брояч. Този брояч е независим от събирането; това е глобално. Драйверът на Java, например, използва произволно инициализиран, статичен AtomicInteger.

Така че защо в документите на Mongo те казват, че идентификаторите е „много вероятно“ да бъдат уникални, вместо направо да казват, че ЩЕ бъдат уникални? Могат да възникнат три възможности, при които няма да получите уникален идентификационен номер (моля, уведомете ме, ако има повече):

Преди тази дискусия, припомнете си, че BSON обектният идентификатор се състои от:

[4 байта секунди от епохата, 3 байта машинен хеш, 2 байта ID на процеса, 3 байта брояч]

Ето трите възможности, така че сами преценете колко е вероятно да получите измама:

1) Препълване на брояча:има 3 байта в брояча. Ако случайно вмъкнете над 16 777 216 (2^24) документа за една секунда, на една и съща машина, в същия процес, тогава може да препълните нарастващите байтове на брояча и в крайна сметка да получите два идентификатора на обекта, които споделят едно и също време, машина , процес и стойности на брояча.

2) Брояч без нарастване:някои драйвери на Mongo използват произволни числа вместо нарастващи числа за байтовете на брояча. В тези случаи има 1/16 777 216 шанс за генериране на неуникален идентификатор, но само ако тези два идентификатора се генерират в една и съща секунда (т.е. преди времевия раздел на идентификационния номер да се актуализира до следващата секунда), на същата машина, в същия процес.

3) Машинно и процесно хеширане до едни и същи стойности. Стойностите на идентификатора на машината и идентификатора на процеса може, в някои много малко вероятни сценарии, да се съпоставят с едни и същи стойности за две различни машини. Ако това се случи и в същото време двата брояча на двете различни машини през една и съща секунда генерират една и съща стойност, тогава ще получите дублиран идентификатор.

Това са трите сценария, за които трябва да внимавате. Сценарий 1 и 3 изглеждат много малко вероятни, а сценарий 2 е напълно избегнат, ако използвате правилния драйвер. Ще трябва да проверите източника на драйвера, за да разберете със сигурност.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да използвате Node.js, за да направите SSH тунелна връзка към база данни MongoDB

  2. Попълнете модел мангуста с поле, което не е идентификатор

  3. Правилно скриване на идентификационните данни на базата данни

  4. преброяване на масиви във всички документи с mongo

  5. java.lang.NoClassDefFoundError при използване на драйвер на MongoDB