Database
 sql >> Base de Dados >  >> RDS >> Database

Manipulando a criação de índice com MongoEngine em Python


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.