MongoEngine je Object Document Mapper (ODM) pro práci s MongoDB z Pythonu. Vrstva ODM mapuje objektový model na dokumentovou databázi podobným způsobem, jako když ORM mapuje objektový model na relační databázi. ODM jako MongoEngine nabízejí funkce podobné relační databázi, např. vynucení schématu, cizí klíč, omezení na úrovni pole atd. na aplikační úrovni.
K dispozici je mnoho dobrých zdrojů, jak se naučit používat MongoEngine, včetně výukového programu zde.
V tomto příspěvku probereme konstrukci programování MongoEngine pro vytváření indexů jako výukový program MongoDB python a s tím spojenou režii na výkon.
Automatické vytváření indexu v MongoEngine
Ve výchozím nastavení MongoEngine ukládá dokumenty do kolekce, která je pojmenována v množném čísle názvu třídy. Například třída User zobrazená níže bude uložena v kolekci s názvem users. Model by měl zdědit dokument třídy MongoEngine, aby se stal mapovaným objektem.
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
Výše definovaná třída User deklaruje dva indexy:1. jméno (pořadí řazení) a 2. email (hašované). MongoEngine vytvoří každý deklarovaný index při první operaci upsert. Tyto indexy se v kolekci vytvářejí pomocí volání createIndex/ensureIndex . MongoEngine se pokusí vytvořit tyto indexy pokaždé, když je dokument vložen do kolekce.
Například
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
Výsledkem tohoto hovoru jsou tři požadavky příkazů na databázový server:dva příkazy, které zajistí, že jméno a e-mailový index existuje v kolekci uživatelů, jeden udělat skutečný upsert.
COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "name_1", key: { name: 1 } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "email_hashed", key: { email: "hashed" } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.user command: insert { insert: "user", ordered: true, documents: [ { name: "Ross", email: "[email protected]", address: "127, Baker Street", _id: ObjectId('584419df01f38269dd9d63c1') } ], writeConcern: { w: 1 } } ninserted:1 keyUpdates:0 writeConflicts:0 numYields:0 reslen:40 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_query 0ms
To je v pořádku pro aplikace, kde je zátěž při zápisu nízká až střední. Pokud je však vaše aplikace náročná na zápis, má to vážný nepříznivý dopad na výkon zápisu.
Zabránění automatickému vytváření indexů
Pokud 'auto_create_index' je nastaveno na false v meta-slovníku pak MongoEngine přeskočí automatické vytváření indexů. Během operací zápisu nejsou odesílány žádné další požadavky createIndex. Vypnutí automatického vytváření indexů je také užitečné v produkčních systémech, kde se indexy obvykle používají během nasazení databáze.
Například
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
V případě, že navrhujete aplikaci náročnou na zápis, má smysl rozhodnout o vašich indexech během fáze návrhu schématu a nasadit je ještě před nasazením aplikace. Pokud plánujete přidat indexy do existujících kolekcí, bylo by lepší postupovat podle dokumentace a vytvořit index na sadě replik. Pomocí tohoto přístupu odstraňujeme servery jeden po druhém a vytváříme na nich indexy .
Použijte metodu MongoEngine create_index k vytvoření indexů v rámci aplikace:
User.create_index(keys, background=False, **kwargs)
Můžete také použít uživatelské rozhraní ScaleGrid, které vám pomůže vytvářet indexy „pohyblivým způsobem“ bez prostojů. Další podrobnosti najdete v našem příspěvku na blogu MongoDB o vytváření indexu.