MongoEngine é um Object Document Mapper (ODM) para trabalhar com MongoDB a partir de Python. A camada ODM mapeia um modelo de objeto para um banco de dados de documentos de maneira semelhante a um ORM que mapeia um modelo de objeto para um banco de dados relacional. ODMs como o MongoEngine oferecem recursos semelhantes a bancos de dados relacionais, por exemplo. imposição de esquema, chave estrangeira, restrição de nível de campo, etc., no nível do aplicativo.
Muitos recursos bons estão disponíveis para aprender o uso do MongoEngine, incluindo um tutorial aqui.
Nesta postagem, discutiremos uma construção de programação do MongoEngine para criar índices como um tutorial python do MongoDB e a sobrecarga de desempenho associada a ele.
Criação automática de índice no MongoEngine
Por padrão, o MongoEngine armazena documentos em uma coleção nomeada como a forma pluralizada do nome da classe. Por exemplo, a classe User mostrada abaixo será armazenada em uma coleção chamada users. Um modelo deve herdar a classe Document do MongoEngine para se tornar um objeto mapeado.
class User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
A classe User definida acima declara dois índices:1. nome (ordem de classificação) e 2. email (com hash). O MongoEngine cria cada índice declarado na primeira operação de upsert. Esses índices são criados na coleção por meio de uma chamada createIndex/ensureIndex . O MongoEngine tenta criar esses índices toda vez que um documento é inserido na coleção.
Para, por exemplo,
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
Esta chamada resulta em três solicitações de comando ao servidor de banco de dados:dois comandos para garantir que o índice de nome e e-mail exista na coleção de usuários, um para fazer o upsert real.
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
Isso é bom para aplicativos em que a carga de gravação é baixa a moderada. No entanto, se seu aplicativo for de gravação intensiva, isso terá um sério impacto adverso no desempenho de gravação.
Evitando a criação de índice automático
Se 'auto_create_index' está definido como falso no metadicionário, o MongoEngine ignora a criação automática de índices. Nenhuma solicitação createIndex extra é enviada durante as operações de gravação. Desativar a criação automática de índice também é útil em sistemas de produção em que os índices são aplicados normalmente durante a implantação do banco de dados.
Por exemplo,
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
Caso você esteja projetando um aplicativo de gravação intensiva, faz sentido decidir sobre seus índices durante a fase de design do esquema e implantá-los antes mesmo de o aplicativo ser implantado. Se você estiver planejando adicionar índices em coleções existentes, seria melhor seguir a documentação para criar índice no conjunto de réplicas. Usando essa abordagem, desativamos os servidores um de cada vez e criamos índices neles.
Use o método create_index do MongoEngine para criar índices dentro do aplicativo:
User.create_index(keys, background=False, **kwargs)
Você também pode usar a interface do usuário do ScaleGrid para ajudá-lo a criar índices de maneira 'Rolling' sem tempo de inatividade. Para obter mais detalhes, consulte nossa postagem no blog de criação de índice do MongoDB.