Všetky dokumenty v zbierke MongoDB majú primárny kľúč skopírovaný _id
. Toto pole je dokumentu automaticky priradené po vložení, takže je zriedka potrebné ho poskytnúť. Čo je zaujímavé na _id
pole je, že je časovo založené. Teda základný typ _id
, ktorý je ObjectId
, je 12-bajtový typ BSON a 4 z týchto bajtov predstavujú sekundy od epochy Unixu.
Čo je tiež zvláštne na _id
pole je, že je automaticky indexované, ako vidíte nižšie volaním getIndexes
na akejkoľvek zbierke.
|
|
A ako si každý pamätá z tradičných RDBMS, indexy sú dôležité, pretože umožňujú rýchlejšie načítanie dokumentov; indexy však zaberajú pamäť a pri vkladaní dokumentov je zaznamenaný mierny výkonnostný trest, pretože je potrebné aktualizovať všetky príslušné indexy. Aj keď by ste mali vážne uvažovať o použití indexov, musíte byť pri ich používaní hospodárni.
Prirodzene, vyhľadávanie podľa dokumentu _id
je vhodný iba vtedy, keď vy vedieť to. Najčastejšie sa dokumenty prehľadávajú prostredníctvom iných polí a ak sa ocitnete pri hľadaní prostredníctvom časových radov, ako napr created_at
potom ste na liečení.
Predstavte si zbierku dabovanú guľatiny
ktorý obsahuje jednoduché dokumenty zachytávajúce rôzne správy denníka. Vzorový dokument môže vyzerať takto:
|
|
Čo keby som chcel nájsť všetky správy denníka pre nejaký dátum, napríklad dnes? Svoj dopyt by som mohol napísať takto:
|
|
Ak vysvetlím tento dotaz, uvidím to, pretože nemám zapnutý index created_at
, je použitý základný kurzor a všetky dokumenty v zbierke boli naskenované, aby sa získal môj výsledok.
|
|
Ako vidíte, vyhľadávanie pomocou created_at
pole môže byť neúčinné; mohli by ste byť v pokušení vrhnúť index na toto pole. To by samozrejme zvýšilo efektívnosť konkrétneho dotazu, vynaložili by ste však náklady na nový index, ktorý spotrebuje viac pamäte a vloženia by boli kvôli aktualizácii tohto novovytvoreného indexu o niečo pomalšie.
Ako sa ukazuje, pretože _id
pole do toho vloží unixovú epochu, môžete rovnako ľahko vytvoriť hľadaný výraz bez vrátane created_at
lúka. Napríklad ovládač MongoDB Ruby umožňuje vytvárať ObjectId
Pochádza z a Čas
ako: