MongoEngine är en Object Document Mapper (ODM) för att arbeta med MongoDB från Python. ODM-lagret mappar en objektmodell till en dokumentdatabas på ett sätt som liknar en ORM som mappar en objektmodell till en relationsdatabas. ODM:er som MongoEngine erbjuder relationsdatabasliknande funktioner, t.ex. schematillämpning, främmande nyckel, fältnivåbegränsning etc på applikationsnivå.
Många bra resurser finns tillgängliga för att lära dig hur MongoEngine används, inklusive en självstudie här.
I det här inlägget kommer vi att diskutera en MongoEngine-programmeringskonstruktion för att skapa index som en MongoDB python-handledning och de prestandakostnader som är kopplade till det.
Automatiskt indexskapande i MongoEngine
Som standard lagrar MongoEngine dokument i en samling som är namngiven som pluralformen av klassnamnet. Till exempel kommer användarklassen som visas nedan att lagras i en samling med namnet användare. En modell bör ärva MongoEngine-klassen Document för att bli ett mappat objekt.
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
Användarklassen definierad ovan deklarerar två index:1. namn (sorteringsordning) och 2. e-post (hashat). MongoEngine skapar varje deklarerat index vid den första upsert-operationen. Dessa index skapas på samlingen via ett createIndex/ensureIndex-anrop. MongoEngine försöker skapa dessa index varje gång ett dokument infogas i samlingen.
För t.ex.
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
Detta samtal resulterar i tre kommandoförfrågningar till databasserver:två kommandon för att säkerställa att namn och e-postindex finns på användarens samling, ett för att göra själva 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
Detta är ok för applikationer där skrivbelastningen är låg till måttlig. Men om din applikation är skrivintensiv har detta en allvarlig negativ inverkan på skrivprestandan.
Undviker att skapa automatiskt index
Om 'auto_create_index' är inställd på false i meta-ordboken hoppar MongoEngine över det automatiska skapandet av index. Inga extra createIndex-förfrågningar skickas under skrivoperationer. Att stänga av automatiskt indexskapande är också användbart i produktionssystem där index vanligtvis används under databasdistribution.
Till exempel,
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
Om du designar en skrivintensiv applikation är det vettigt att besluta om dina index under schemadesignfasen och distribuera dem redan innan applikationen distribueras. Om du planerar att lägga till index på befintliga samlingar, skulle det vara bättre att följa dokumentationen för att bygga index på replikuppsättningen. Med detta tillvägagångssätt tar vi ner servrarna en i taget och bygger index på dem.
Använd MongoEngine create_index-metoden för att skapa index i applikationen:
User.create_index(keys, background=False, **kwargs)
Du kan också använda ScaleGrid-gränssnittet för att hjälpa dig bygga index på ett "rullande sätt" utan driftstopp. För mer information, se vårt MongoDB indexbyggande blogginlägg.