sql >> Database teknologi >  >> NoSQL >> MongoDB

Mulighed for at duplikerede Mongo ObjectId'er bliver genereret i to forskellige samlinger?

Kort svar

Bare for at tilføje et direkte svar på dit indledende spørgsmål:JA, hvis du bruger BSON Object ID-generering, så for de fleste drivere ID'erne vil næsten helt sikkert være unikke på tværs af samlinger. Se nedenfor for, hvad "næsten helt sikkert" betyder.

Langt svar

BSON-objekt-id'erne genereret af Mongo DB-drivere er højst sandsynligt unikke på tværs af samlinger. Dette er primært på grund af de sidste 3 bytes af ID'et, som for de fleste drivere genereres via en statisk stigningstæller. Denne tæller er samlingsuafhængig; det er globalt. Java-driveren bruger for eksempel et tilfældigt initialiseret, statisk AtomicInteger.

Så hvorfor siger de i Mongo-dokumenterne, at ID'erne er "højst sandsynligt" for at være unikke, i stedet for ligefrem at sige, at de VIL være unikke? Der kan opstå tre muligheder, hvor du ikke får et unikt ID (giv mig venligst besked, hvis der er flere):

Inden denne diskussion skal du huske, at BSON-objekt-id'et består af:

[4 bytes sekunder siden epoke, 3 bytes maskinhash, 2 bytes proces-id, 3 bytes tæller]

Her er de tre muligheder, så du vurderer selv, hvor sandsynligt det er, at du får en dupe:

1) Tælleroverløb:der er 3 bytes i tælleren. Hvis du tilfældigvis indsætter over 16.777.216 (2^24) dokumenter på et enkelt sekund, på den samme maskine, i samme proces, så kan du løbe over de stigende tællerbytes og ende med to objekt-id'er, der deler samme tid, maskine , proces- og tællerværdier.

2) Tæller, der ikke stiger:nogle Mongo-drivere bruger tilfældige tal i stedet for stigende tal for tællerbytes. I disse tilfælde er der en chance på 1/16.777.216 for at generere et ikke-unik id, men kun hvis disse to id'er genereres i samme sekund (dvs. før tidssektionen af ​​id'et opdateres til næste sekund), på det samme maskine, i samme proces.

3) Maskin- og proceshash til samme værdier. Værdierne for maskin-id og proces-id kan i nogle højst usandsynlige scenarier knyttes til de samme værdier for to forskellige maskiner. Hvis dette sker, og samtidig de to tællere på de to forskellige maskiner, i løbet af det samme sekund, genererer den samme værdi, så ender du med et dublet-id.

Dette er de tre scenarier, du skal være opmærksom på. Scenarie 1 og 3 virker meget usandsynlige, og scenario 2 kan helt undgås, hvis du bruger den rigtige driver. Du bliver nødt til at tjekke kilden til driveren for at vide det med sikkerhed.



  1. Sådan omdirigeres output fra Redis-abonnement

  2. Tips til lagring af MongoDB-sikkerhedskopier i skyen

  3. Hvordan udelukker man dokumenter fra søgeresultater med felter, der ikke er til stede i forespørgslen?

  4. Redis-forbindelse/bufferstørrelsesgrænse overskredet