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

Possibilità di generare duplicati di Mongo ObjectId in due raccolte diverse?

Risposta breve

Giusto per aggiungere una risposta diretta alla tua domanda iniziale:SÌ, se utilizzi la generazione di ID oggetto BSON, allora per la maggior parte dei driver gli ID saranno quasi sicuramente univoci in tutte le raccolte. Vedi sotto per cosa significa "quasi certamente".

Risposta lunga

È molto probabile che gli ID oggetto BSON generati dai driver Mongo DB siano univoci tra le raccolte. Ciò è dovuto principalmente agli ultimi 3 byte dell'ID, che per la maggior parte dei driver viene generato tramite un contatore incrementale statico. Quel contatore è indipendente dalla raccolta; è globale. Il driver Java, ad esempio, utilizza un AtomicInteger statico inizializzato in modo casuale.

Allora perché, nei documenti Mongo, dicono che è "molto probabile" che gli ID siano univoci, invece di affermare apertamente che SARANNO univoci? Possono verificarsi tre possibilità in cui non otterrai un ID univoco (per favore fatemi sapere se ce ne sono altri):

Prima di questa discussione, ricorda che l'ID oggetto BSON è costituito da:

[4 byte secondi dall'epoca, 3 byte hash macchina, 2 byte ID processo, 3 byte contatore]

Ecco le tre possibilità, quindi giudica tu stesso quanto è probabile che venga ingannato:

1) Counter overflow:ci sono 3 byte nel contatore. Se ti capita di inserire più di 16.777.216 (2^24) documenti in un solo secondo, sulla stessa macchina, nello stesso processo, potresti sovraccaricare i byte del contatore incrementale e finire con due ID oggetto che condividono lo stesso tempo, macchina , processo e valori del contatore.

2) Contatore non incrementale:alcuni driver Mongo usano numeri casuali invece di numeri incrementali per i byte del contatore. In questi casi, c'è una possibilità di 1/16.777.216 di generare un ID non univoco, ma solo se quei due ID vengono generati nello stesso secondo (cioè prima che la sezione temporale dell'ID si aggiorni al secondo successivo), sullo stesso macchina, nello stesso processo.

3) Hash macchina e processo con gli stessi valori. I valori dell'ID macchina e dell'ID processo possono, in alcuni scenari altamente improbabili, essere mappati agli stessi valori per due macchine diverse. Se ciò si verifica, e contemporaneamente i due contatori sulle due diverse macchine, nello stesso secondo, generano lo stesso valore, ti ritroverai con un ID duplicato.

Questi sono i tre scenari a cui prestare attenzione. Gli scenari 1 e 3 sembrano altamente improbabili e lo scenario 2 è totalmente evitabile se si utilizza il driver giusto. Dovrai controllare la fonte del driver per saperlo con certezza.