sql >> Database >  >> NoSQL >> MongoDB

Mogelijkheid dat dubbele Mongo ObjectId's worden gegenereerd in twee verschillende collecties?

Kort antwoord

Gewoon om een ​​direct antwoord op uw eerste vraag toe te voegen:JA, als u BSON Object ID-generatie gebruikt, dan voor de meeste stuurprogramma's de ID's zullen vrijwel zeker uniek zijn voor alle collecties. Zie hieronder wat 'vrijwel zeker' betekent.

Lang antwoord

De BSON-object-ID's die worden gegenereerd door Mongo DB-stuurprogramma's zijn hoogstwaarschijnlijk uniek in collecties. Dit komt voornamelijk door de laatste 3 bytes van de ID, die voor de meeste stuurprogramma's wordt gegenereerd via een statische oplopende teller. Die balie is collectieonafhankelijk; het is globaal. Het Java-stuurprogramma gebruikt bijvoorbeeld een willekeurig geïnitialiseerd, statisch AtomicInteger.

Dus waarom zeggen ze in de Mongo-documenten dat de ID's "zeer waarschijnlijk" uniek zijn, in plaats van ronduit te zeggen dat ze uniek ZULLEN zijn? Er kunnen zich drie mogelijkheden voordoen waarbij u geen unieke ID krijgt (laat het me weten als er meer zijn):

Bedenk vóór deze discussie dat de BSON-object-ID bestaat uit:

[4 bytes seconden sinds tijdperk, 3 bytes machine-hash, 2 bytes proces-ID, 3 bytes teller]

Hier zijn de drie mogelijkheden, dus je beoordeelt zelf hoe waarschijnlijk het is om een ​​dupe te krijgen:

1) Telleroverloop:er staan ​​3 bytes in de teller. Als u toevallig meer dan 16.777.216 (2^24) documenten in een enkele seconde, op dezelfde machine, in hetzelfde proces invoegt, dan kunt u de oplopende tellerbytes overlopen en eindigen met twee object-ID's die dezelfde tijd delen, machine , proces- en tellerwaarden.

2) Teller niet-oplopend:sommige Mongo-stuurprogramma's gebruiken willekeurige getallen in plaats van oplopende getallen voor de tellerbytes. In deze gevallen is er een kans van 1/16.777.216 om een ​​niet-unieke ID te genereren, maar alleen als die twee ID's in dezelfde seconde worden gegenereerd (d.w.z. vóór de tijdsectie van de ID-updates naar de volgende seconde), op dezelfde machine, in hetzelfde proces.

3) Bewerk en verwerk hash tot dezelfde waarden. De computer-ID en proces-ID-waarden kunnen, in een zeer onwaarschijnlijk scenario, worden toegewezen aan dezelfde waarden voor twee verschillende machines. Als dit gebeurt, en tegelijkertijd de twee tellers op de twee verschillende machines, gedurende dezelfde seconde, dezelfde waarde genereren, krijg je een dubbele ID.

Dit zijn de drie scenario's om op te letten. Scenario 1 en 3 lijken hoogst onwaarschijnlijk, en scenario 2 is volledig te vermijden als je de juiste driver gebruikt. U moet de bron van het stuurprogramma controleren om het zeker te weten.



  1. MongoDB deleteOne()

  2. Heeft iemand CouchDB en verschillende offline implementaties (PouchDB) geprobeerd?

  3. Match-finder met meerdere parameters met Redis

  4. Fout:geen ondersteuning voor unix-sockets op Windows die mongodb verbindt