MongoEngine е обектен Document Mapper (ODM) за работа с MongoDB от Python. ODM слоят съпоставя обектен модел с база данни с документи по начин, подобен на ORM, съпоставящ обектен модел в релационна база данни. ODM като MongoEngine предлагат функции, подобни на релационна база данни, напр. прилагане на схема, външен ключ, ограничение на ниво поле и т.н. на ниво приложение.
Налични са много добри ресурси за да научите как да използвате MongoEngine, включително урок тук.
В тази публикация ще обсъдим програмна конструкция на MongoEngine за създаване на индекси като урок за MongoDB python и режийните разходи за производителност, свързани с него.
Автоматично създаване на индекс в MongoEngine
По подразбиране MongoEngine съхранява документи в колекция, която е наречена като множествена форма на името на класа. Например, показаният по-долу клас User ще бъде съхранен в колекция с име users. Моделът трябва да наследи MongoEngine клас Document, за да стане съпоставен обект.
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
Класът User, дефиниран по-горе, декларира два индекса:1. име (ред на сортиране) и 2. имейл (хеширан). MongoEngine създава всеки деклариран индекс при първата операция upsert. Тези индекси се създават в колекцията чрез извикване createIndex/ensureIndex . MongoEngine се опитва да създаде тези индекси всеки път, когато документ се вмъкне в колекцията.
Напр.
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
Това обаждане води до три командни заявки към сървъра на базата данни:две команди, за да се гарантира, че името и индексът на имейл съществуват в колекцията на потребителите, една за да извършите същинското раздразнение.
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
Това е добре за приложения, при които натоварването при запис е ниско до умерено. Въпреки това, ако приложението ви е с интензивно писане, това има сериозно неблагоприятно въздействие върху производителността на запис.
Избягване на автоматичното създаване на индекс
Ако 'auto_create_index' е зададен на false в мета-речника, тогава MongoEngine пропуска автоматичното създаване на индекси. Не се изпращат допълнителни заявки за createIndex по време на операции по запис. Изключването на автоматичното създаване на индекси е полезно и в производствени системи, където индексите се прилагат обикновено по време на разполагане на база данни.
Например,
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
В случай, че проектирате приложение с интензивно писане, има смисъл да вземете решение за вашите индекси по време на фазата на проектиране на схемата и да ги разположите дори преди приложението да бъде разгърнато. Ако планирате да добавяте индекси към съществуващи колекции, би било по-добре да следвате документацията, за да изградите индекс върху набор от реплики. Използвайки този подход, сваляме сървърите един по един и изграждаме индекси върху тях.
Използвайте метода MongoEngine create_index за създаване на индекси в приложението:
User.create_index(keys, background=False, **kwargs)
Можете също да използвате потребителския интерфейс на ScaleGrid, за да ви помогне да изградите индекси по „подвижен начин“ без прекъсване. За повече подробности вижте нашата публикация в блога за изграждане на индекси на MongoDB.