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.
|
|
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:
|
|
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:
|
|
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.
|
|
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 ObjectId
Je od a Čas
jako tak: