MongoEngine is een Object Document Mapper (ODM) voor het werken met MongoDB vanuit Python. De ODM-laag wijst een objectmodel toe aan een documentdatabase op een manier die vergelijkbaar is met een ORM die een objectmodel toewijst aan een relationele database. ODM's zoals MongoEngine bieden relationele database-achtige functies, b.v. schemahandhaving, externe sleutel, beperking op veldniveau, enz. op applicatieniveau.
Er zijn veel goede bronnen beschikbaar om het gebruik van MongoEngine te leren, inclusief een tutorial hier.
In dit bericht bespreken we een MongoEngine-programmeerconstructie voor het maken van indexen als MongoDB python-tutorial en de bijbehorende prestatieoverhead.
Automatische indexcreatie in MongoEngine
Standaard slaat MongoEngine documenten op in een verzameling die wordt genoemd als de meervoudsvorm van de klassenaam. De gebruikersklasse die hieronder wordt weergegeven, wordt bijvoorbeeld opgeslagen in een verzameling met de naam gebruikers. Een model moet de MongoEngine-klasse Document erven om een toegewezen object te worden.
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
De hierboven gedefinieerde gebruikersklasse declareert twee indexen:1. naam (sorteervolgorde) en 2. e-mail (gehasht). MongoEngine maakt elke gedeclareerde index aan bij de eerste upsert-bewerking. Deze indexen worden in de collectie gemaakt via een createIndex/ensureIndex-aanroep. MongoEngine probeert deze indexen te creëren telkens wanneer een document in de collectie wordt ingevoegd.
Voor bijv.
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
Deze oproep resulteert in drie opdrachtverzoeken aan databaseserver:twee commando's om ervoor te zorgen dat de naam en e-mailindex aanwezig zijn in de gebruikersverzameling, één om de eigenlijke opsmuk te doen.
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
Dit is ok voor toepassingen waar de schrijfbelasting laag tot matig is. Als uw toepassing echter schrijfintensief is, heeft dit een ernstige nadelige invloed op de schrijfprestaties.
Het maken van een automatische index vermijden
Als 'auto_create_index' is ingesteld op false in het meta-woordenboek, dan slaat MongoEngine het automatisch aanmaken van indexen over. Er worden geen extra createIndex-verzoeken verzonden tijdens schrijfbewerkingen. Het uitschakelen van het automatisch maken van indexen is ook handig in productiesystemen waar indexen doorgaans worden toegepast tijdens database-implementatie.
Bijvoorbeeld
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
Als u een schrijfintensieve toepassing ontwerpt, is het zinvol om uw indexen te bepalen tijdens de ontwerpfase van het schema en deze te implementeren zelfs voordat de toepassing wordt geïmplementeerd. Als u van plan bent indexen toe te voegen aan bestaande verzamelingen, is het beter om de documentatie te volgen om een index op replicaset te bouwen. Met deze benadering ’
Gebruik de MongoEngine create_index methode om indexen te maken binnen de applicatie:
User.create_index(keys, background=False, **kwargs)
U kunt ook de gebruikersinterface van ScaleGrid gebruiken om indexen op een 'rollende manier' te bouwen zonder downtime. Raadpleeg voor meer informatie onze blogpost over het bouwen van een MongoDB-index.