sql >> Databáze >  >> NoSQL >> MongoDB

Možnost generování duplicitních Mongo ObjectId ve dvou různých kolekcích?

Krátká odpověď

Jen pro doplnění přímé odpovědi na vaši úvodní otázku:ANO, pokud používáte generování BSON Object ID, pak pro většinu ovladačů ID budou téměř jistě jedinečná napříč sbírkami. Níže se dozvíte, co znamená „téměř jistě“.

Dlouhá odpověď

BSON Object ID generované ovladači Mongo DB budou s vysokou pravděpodobností jedinečné napříč kolekcemi. Důvodem jsou především poslední 3 bajty ID, které pro většinu ovladačů je generován prostřednictvím statického inkrementačního čítače. Tento čítač je nezávislý na sběru; je to globální. Ovladač Java například používá náhodně inicializovaný statický AtomicInteger.

Proč tedy v dokumentech Mongo říkají, že ID jsou „s vysokou pravděpodobností“ jedinečná, místo aby rovnou řekli, že BUDE jedinečná? Pokud nezískáte jedinečné ID, mohou nastat tři možnosti (pokud existuje více, dejte mi prosím vědět):

Před touto diskusí si připomeňte, že ID objektu BSON se skládá z:

[4 bajty sekund od epochy, 3 bajty strojového hash, 2 bajty ID procesu, 3 bajty počítadlo]

Zde jsou tři možnosti, takže posuďte sami, jaká je pravděpodobnost, že dostanete napálit:

1) Přetečení čítače:v čítači jsou 3 bajty. Pokud náhodou vložíte více než 16 777 216 (2^24) dokumentů za jedinou sekundu, na stejném počítači, ve stejném procesu, může se stát, že přetečete zvyšující se bajty čítače a skončíte se dvěma ID objektů, která sdílejí stejný čas. , proces a hodnoty čítače.

2) Nezvyšující se čítač:některé ovladače Mongo používají pro bajty čítače náhodná čísla místo zvyšujících se čísel. V těchto případech existuje 1/16 777 216 šance na vygenerování nejedinečného ID, ale pouze pokud jsou tato dvě ID vygenerována ve stejnou sekundu (tj. před tím, než se časová část ID aktualizuje na další sekundu), ve stejnou dobu. stroje, ve stejném procesu.

3) Stroj a proces hash na stejné hodnoty. Hodnoty ID stroje a ID procesu se mohou v některých vysoce nepravděpodobných scénářích mapovat na stejné hodnoty pro dva různé stroje. Pokud k tomu dojde a zároveň dva čítače na dvou různých počítačích během stejné sekundy vygenerují stejnou hodnotu, skončíte s duplicitním ID.

Toto jsou tři scénáře, na které si dát pozor. Scénář 1 a 3 se zdají velmi nepravděpodobné a scénáři 2 se lze zcela vyhnout, pokud používáte správný ovladač. Pro jistotu budete muset zkontrolovat zdroj ovladače.



  1. MongoDB $dateToString Specifikátory formátu

  2. Získejte hodnotu Set z Redis pomocí RedisTemplate

  3. MongoError:Parametr filtru musí být objekt

  4. Memcache v/s redis pro udržení trvalých relací?