MongoEngine to Object Document Mapper (ODM) do pracy z MongoDB z Pythona. Warstwa ODM mapuje model obiektowy do bazy danych dokumentów w sposób podobny do mapowania modelu obiektowego na relacyjną bazę danych w ORM. ODM, takie jak MongoEngine, oferują funkcje podobne do relacyjnych baz danych, np. wymuszanie schematu, klucz obcy, ograniczenie na poziomie pola itp. na poziomie aplikacji.
Dostępnych jest wiele dobrych zasobów, aby nauczyć się korzystania z MongoEngine, w tym samouczek tutaj.
W tym poście omówimy konstrukcję programistyczną MongoEngine do tworzenia indeksów jako samouczek MongoDB w Pythonie oraz związane z tym obciążenie wydajnościowe.
Automatyczne tworzenie indeksu w MongoEngine
Domyślnie MongoEngine przechowuje dokumenty w kolekcji, której nazwa odpowiada liczbie mnogiej nazwy klasy. Na przykład klasa User pokazana poniżej będzie przechowywana w kolekcji o nazwie users. Model powinien dziedziczyć klasę MongoEngine Document, aby stać się mapowanym obiektem.
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
Zdefiniowana powyżej klasa User deklaruje dwa indeksy:1. nazwa (kolejność sortowania) i 2. adres e-mail (haszowany). MongoEngine tworzy każdy zadeklarowany indeks podczas pierwszej operacji upsert. Te indeksy są tworzone w kolekcji za pomocą wywołania createIndex/ensureIndex. MongoEngine próbuje utworzyć te indeksy za każdym razem, gdy dokument jest wstawiany do kolekcji.
Na przykład
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
Wynikiem tego połączenia są trzy żądania poleceń do serwera bazy danych:dwa polecenia, aby upewnić się, że nazwa i indeks e-mail istnieją w kolekcji użytkowników, jeden zrobić rzeczywistą upsurzenie.
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
Jest to odpowiednie dla aplikacji, w których obciążenie zapisu jest niskie lub umiarkowane. Jeśli jednak Twoja aplikacja intensywnie zapisuje, ma to poważny negatywny wpływ na wydajność zapisu.
Unikanie automatycznego tworzenia indeksu
Jeśli 'auto_create_index' jest ustawione na fałsz w metasłowniku MongoEngine pomija automatyczne tworzenie indeksów. Podczas operacji zapisu nie są wysyłane żadne dodatkowe żądania createIndex. Wyłączenie automatycznego tworzenia indeksów jest również przydatne w systemach produkcyjnych, w których indeksy są zwykle stosowane podczas wdrażania bazy danych.
Na przykład
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
Jeśli projektujesz aplikację, która intensywnie pisze, warto zdecydować o indeksach w fazie projektowania schematu i wdrożyć je jeszcze przed wdrożeniem aplikacji. Jeśli planujesz dodać indeksy do istniejących kolekcji, lepiej będzie postępować zgodnie z dokumentacją, aby zbudować indeks na zestawie replik. Stosując to podejście, wyłączamy serwery pojedynczo i budujemy na nich indeksy.
Użyj metody MongoEngine create_index do tworzenia indeksów w aplikacji:
User.create_index(keys, background=False, **kwargs)
Możesz także użyć interfejsu użytkownika ScaleGrid, aby pomóc w tworzeniu indeksów w sposób „kroczący”, bez przestojów. Aby uzyskać więcej informacji, zapoznaj się z naszym wpisem na blogu poświęconym budowaniu indeksu MongoDB.