Programování

Primární klíče MongoDB jsou váš přítel

Všechny dokumenty ve sbírce MongoDB mají primární dabovaný klíč _id. Toto pole je automaticky přiděleno dokumentu po vložení, takže je zřídka nutné jej poskytnout. Co je na tom zajímavého _id pole je, že je podle času. To je základní typ _id, který je ObjectId, je 12bajtový typ BSON a 4 z těchto bajtů představují sekundy od epochy Unixu.

Co je také zvláštního na _id pole je, že je automaticky indexováno, jak vidíte níže voláním getIndexes na jakékoli sbírce.

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 jak si každý pamatuje z tradičních RDBMS, indexy jsou důležité, protože umožňují rychlejší načítání dokumentů; rejstříky nicméně spotřebovávají paměť a při vkládání dokumentů dochází k mírnému snížení výkonu, protože je nutné aktualizovat všechny odpovídající indexy. I když byste měli vážně uvažovat o použití indexů, musíte být při jejich používání ekonomičtí.

Přirozeně vyhledávání podle dokumentu _id je vhodné, jen když vy znát to. Více často než ne, dokumenty jsou prohledávány prostřednictvím jiných polí a pokud zjistíte, že prohledáváte časové řady, například created_at pak vás čeká lahůdka.

Představte si kolekci nazvanou protokoly který obsahuje jednoduché dokumenty zachycující různé zprávy protokolu. Ukázkový dokument může vypadat například takto:

1 2 3 4 5 6 
{"_id": ObjectId ("51c4ab6d4d6906d494460728"), "message": "havaroval, žádná taková výjimka metody", "type": "crash", "created_at": ISODate ("2013-06-21T19: 37: 17,992Z" ")} 

Co kdybych chtěl najít všechny zprávy protokolu pro určité datum, například dnes? Mohl bych napsat svůj dotaz takto:

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

Pokud k tomuto dotazu hodím vysvětlení, vidím to, protože nemám index created_at, je použit základní kurzor a všechny dokumenty ve sbírce byly naskenovány, aby se získal můj výsledek.

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"} 

Jak vidíte, vyhledávání pomocí created_at pole může být neúčinné; takže byste mohli být v pokušení vložit index na toto pole. To by přirozeně zefektivnilo tento konkrétní dotaz, ale vznikly by vám náklady na nový index, který spotřebovává více paměti a vložky by byly o něco pomalejší kvůli aktualizaci tohoto nově vytvořeného indexu.

Jak se ukázalo, protože _id pole do něj vloží epochu Unixu, můžete stejně snadno vytvořit hledaný výraz bez včetně created_at pole. Například ovladač MongoDB Ruby umožňuje vytvářet ObjectIdJe od a Čas jako tak:

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