sql >> Databasteknik >  >> NoSQL >> MongoDB

Möjlighet att duplicera Mongo ObjectId genereras i två olika samlingar?

Kort svar

Bara för att lägga till ett direkt svar på din första fråga:JA, om du använder generering av BSON Object ID, så för de flesta drivrutiner ID:n kommer nästan säkert att vara unika i alla samlingar. Se nedan för vad "nästan säkert" betyder.

Långt svar

BSON-objekt-ID:n som genereras av Mongo DB-drivrutiner är högst sannolikt unika för samlingar. Detta beror främst på de sista 3 byten av ID:t, vilket för de flesta drivrutiner genereras via en statisk inkrementerande räknare. Den räknaren är samlingsoberoende; det är globalt. Java-drivrutinen, till exempel, använder ett slumpmässigt initierat, statiskt AtomicInteger.

Så varför, i Mongo-dokumenten, säger de att ID:n är "högst sannolikt" att vara unika, istället för att direkt säga att de KOMMER att vara unika? Tre möjligheter kan uppstå där du inte får ett unikt ID (meddela mig om det finns fler):

Innan denna diskussion, kom ihåg att BSON Object ID består av:

[4 byte sekunder sedan epok, 3 byte maskinhash, 2 byte process-ID, 3 byte räknare]

Här är de tre möjligheterna, så du bedömer själv hur troligt det är att få en dupe:

1) Räknarspill:det finns 3 byte i räknaren. Om du råkar infoga över 16 777 216 (2^24) dokument på en enda sekund, på samma dator, i samma process, kan du svämma över de ökande räknarbytena och sluta med två objekt-ID:n som delar samma tid, maskin , process- och räknarvärden.

2) Räknare som inte ökar:vissa Mongo-drivrutiner använder slumptal istället för ökande siffror för räknarbyte. I dessa fall finns det en chans på 1/16 777 216 att generera ett icke-unikt ID, men bara om dessa två ID:n genereras i samma sekund (dvs innan tidsdelen av ID uppdateras till nästa sekund), på samma maskin, i samma process.

3) Maskin- och processhash till samma värden. Maskin-ID- och process-ID-värdena kan i vissa mycket osannolika scenarion mappas till samma värden för två olika maskiner. Om detta inträffar, och samtidigt de två räknarna på de två olika maskinerna, under samma sekund, genererar samma värde, kommer du att få ett dubblett-ID.

Det här är de tre scenarierna att se upp med. Scenario 1 och 3 verkar mycket osannolika, och scenario 2 kan helt undvikas om du använder rätt drivrutin. Du måste kontrollera källan till drivrutinen för att veta säkert.



  1. Mongo update array element (.NET drivrutin 2.0)

  2. Redis Client List syfte och beskrivning

  3. docker-compose + django + redis - Fel 111 vid anslutning till 127.0.0.1:6379. Anslutningen vägrades

  4. Finns det något sätt att "snyggt" skriva ut MongoDB-skalutdata till en fil?