MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Possibilidade de duplicação de ObjectIds do Mongo sendo gerados em duas coleções diferentes?


Resposta curta

Apenas para adicionar uma resposta direta à sua pergunta inicial:SIM, se você usa a geração BSON Object ID, então para a maioria dos drivers os IDs quase certamente serão exclusivos nas coleções. Veja abaixo o que significa "quase certamente".

Resposta longa

Os IDs de objetos BSON gerados pelos drivers do Mongo DB são altamente prováveis ​​de serem exclusivos nas coleções. Isso se deve principalmente aos últimos 3 bytes do ID, que para a maioria dos drivers é gerado através de um contador de incremento estático. Esse contador é independente da coleção; é global. O driver Java, por exemplo, usa um AtomicInteger estático inicializado aleatoriamente.

Então, por que, nos documentos do Mongo, eles dizem que os IDs são "altamente prováveis" de serem únicos, em vez de dizer abertamente que serão únicos? Três possibilidades podem ocorrer em que você não receberá um ID exclusivo (por favor, deixe-me saber se houver mais):

Antes desta discussão, lembre-se de que o BSON Object ID consiste em:

[4 bytes segundos desde a época, hash de máquina de 3 bytes, ID de processo de 2 bytes, contador de 3 bytes]

Aqui estão as três possibilidades, para que você julgue por si mesmo a probabilidade de ser enganado:

1) Estouro do contador:há 3 bytes no contador. Se você inserir mais de 16.777.216 (2^24) documentos em um único segundo, na mesma máquina, no mesmo processo, poderá estourar os bytes do contador de incremento e acabar com dois IDs de objeto que compartilham o mesmo tempo, máquina , processo e valores de contador.

2) Contador não incrementado:alguns drivers Mongo usam números aleatórios em vez de incrementar números para os bytes do contador. Nesses casos, há uma chance de 1/16.777.216 de gerar um ID não exclusivo, mas somente se esses dois IDs forem gerados no mesmo segundo (ou seja, antes que a seção de tempo do ID seja atualizada para o próximo segundo), no mesmo máquina, no mesmo processo.

3) Hash de máquina e processo para os mesmos valores. Os valores de ID de máquina e ID de processo podem, em alguns cenários altamente improváveis, mapear para os mesmos valores para duas máquinas diferentes. Se isso ocorrer e, ao mesmo tempo, os dois contadores nas duas máquinas diferentes, durante o mesmo segundo, gerarem o mesmo valor, você terminará com um ID duplicado.

Estes são os três cenários a serem observados. Os cenários 1 e 3 parecem altamente improváveis, e o cenário 2 é totalmente evitável se você estiver usando o driver correto. Você terá que verificar a fonte do driver para ter certeza.