Programovanie

Primárne kľúče MongoDB sú váš priateľ

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.

1 2 3 4 5 6 7 8 9 10 11 
> db.things.getIndexes () [{"v": 1, "key": {"_id": 1}, "ns": "test.things", "name": "_id_"}] 

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:

1 2 3 4 5 6 
{"_id": ObjectId ("51c4ab6d4d6906d494460728"), "message": "havaroval, žiadna takáto výnimka metódy", "type": "crash", "created_at": ISODate ("2013-06-21T19: 37: 17,992Z" ")} 

Č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:

1 
db.logs.find ({created_at: {'$ gt': new Date (2013, 5, 20)}}) 

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.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 
> db.logs.find ({created_at: {'$ gt': new Date (2013, 5, 20)}}). explains () {"cursor": "BasicCursor", "isMultiKey": false, "n" : 2, "nscannedObjects": 4, "nscanned": 4, "nscannedObjectsAllPlans": 4, "nscannedAllPlans": 4, "scanAndOrder": false, "indexOnly": false, "nYields": 0, "nChunkSkips": 0 , "millis": 0, "indexBounds": {}, "server": "ghome-computer.home: 27017"} 

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ť ObjectIdPochádza z a Čas ako:

$config[zx-auto] not found$config[zx-overlay] not found