Primární klíč Mongodb: Příklad nastavení pole _id pomocí ObjectId()
⚡ Chytré shrnutí
MongoDB Primární klíč je pole _id, které jednoznačně identifikuje každý dokument v kolekci. Ve výchozím nastavení obsahuje automaticky generované ObjectId, ale při vkládání dokumentu můžete poli _id přiřadit i vlastní hodnotu.

Co je primární klíč MongoDB?
In MongoDB, pole _id jako primární klíč pro kolekci, aby bylo možné každý dokument v kolekci jednoznačně identifikovat. Pole _id obsahuje jedinečnou hodnotu ObjectID.
Ve výchozím nastavení při vkládání dokumentů do kolekce, pokud nepřidáte název pole s _id v názvu pole, pak MongoDB automaticky přidá pole ID objektu, jak je znázorněno níže
Když se dotazujete na dokumenty v kolekci, můžete vidět ObjectId pro každý dokument v kolekci.
Pokud to chcete zajistit MongoDB nevytvoří pole _id při vytváření kolekce a pokud chcete zadat své vlastní id jako _id kolekce, musíte to explicitně definovat při vytváření kolekce.
Když explicitně vytváříte pole id, musí být vytvořeno s _id v názvu.
Podívejme se na příklad, jak toho můžeme dosáhnout.
db.Employee.insert({_id:10, "EmployeeName" : "Smith"})
Code Vysvětlení:
- Předpokládáme, že vytváříme první dokument v kolekci, a proto ve výše uvedeném příkazu při vytváření kolekce explicitně definujeme pole _id a definujeme pro něj hodnotu.
Pokud je příkaz úspěšně proveden a nyní pomocí příkazu find zobrazíte dokumenty v kolekci, zobrazí se následující výstup
Výstup:
Výstup jasně ukazuje, že pole _id, které jsme definovali při vytváření kolekce, se nyní používá jako primární klíč pro kolekci.
Co je ObjectId v MongoDB?
ObjectId je výchozí typ hodnoty, který MongoDB přiřazuje primárnímu klíči _id. Jedná se o 12bajtový identifikátor, který je navržen tak, aby byl globálně jedinečný napříč servery a kolekcemi, takže dva dokumenty téměř nikdy neobdrží stejnou hodnotu. Protože ovladač klienta může vygenerovat ObjectId bez dotazování serveru, MongoDB umožňuje rychlé vkládání dokumentů a škálování napříč mnoha stroji bez centrálního pultu.
Každé ObjectId je uloženo v kompaktním binárním tvaru, ale zobrazuje se jako hexadecimální řetězec o délce 24 znaků, například ObjectId(„507f1f77bcf86cd799439011“). První bajty jsou založeny na aktuálním čase, což znamená, že hodnoty se s vytvářením dokumentů plynule zvyšují. Díky tomu je ObjectId nejen jedinečné, ale také zhruba seřaditelné podle pořadí vkládání, což je užitečná vlastnost, když chcete nejdříve zobrazit nejnovější nebo nejstarší záznamy.
Struktura a MongoDB ID objektu
A MongoDB ID objektu (ObjectId) má přesně 12 bajtů a každá část má specifický význam. Pochopení struktury pomáhá vysvětlit, proč jsou ID objektu jedinečná a časově seřazená:
- 4bajtové časové razítko: Počet sekund od unixové epochy, zaznamenávající, kdy bylo ObjectId vytvořeno. Díky tomu lze ID seřadit podle času.
- 5bajtová náhodná hodnota: Hodnota generovaná jednou za proces, kombinující identitu stroje a procesu, takže různí klienti vytvářejí různá ID.
- 3bajtový inkrementační čítač: Čítač, který začíná náhodnou hodnotou a zvyšuje se s každým novým ObjectId ve stejné sekundě, čímž se zabraňuje kolizím během rychlého vkládání.
Tyto tři části společně zaručují, že každé ObjectId je jedinečné, a to i v případě, že je mnoho dokumentů vloženo současně na různé servery. Vložený čas vytvoření si můžete kdykoli přečíst voláním metody getTimestamp() pro ObjectId.
Výhody použití ObjectId jako primárního klíče
Použití výchozího ObjectId jako primárního klíče _id nabízí několik praktických výhod, a proto většina MongoDB kolekce se na tom spoléhají:
- Automatické generování: Nemusíte si sami vytvářet ani spravovat hodnoty klíčů, což snižuje riziko duplicitních klíčů.
- Globální jedinečnost: Identifikátory ObjectId zůstávají napříč servery jedinečné, takže fungují dobře v distribuovaných a horizontálně rozdělených nasazeních.
- Vestavěné časové razítko: Vložený čas vytvoření umožňuje třídit nebo filtrovat dokumenty podle stáří bez dalšího pole s datem.
- Vysoký výkon: Generování na straně klienta zabraňuje zpětnému přenosu na server,ping vkládá rychle.
I když ObjectId vyhovuje většině aplikací, stále si můžete zvolit vlastní _id, například e-mailovou adresu nebo kód produktu, pokud přirozený obchodní klíč zjednodušuje dotazy. Správná volba závisí na tom, jak plánujete vyhledávat a propojovat svá data.


