Menu Docs

Otimizar queries com índices

Neste guia, você pode aprender como usar índices com Mongoid. Os índices podem melhorar a eficiência das queries limitando o número de documentos que o MongoDB precisa digitalizar. Se seu aplicação estiver executando consultas repetidamente em determinados campos, poderá criar um índice nesses campos para melhorar o desempenho da consulta.

As seções a seguir neste guia descrevem como declarar e criar diferentes tipos de índices usando o Mongoid. Os exemplos utilizam o modelo Restaurant , que mapeia para a coleção restaurants no banco de dados do sample_restaurants . Para saber como se conectar a esse banco de dados e à coleção usando o Mongoid, consulte os guias Início rápido - Ruby on Rails ou Início rápido - Sinatra.

Ao utilizar Mongoid, você pode declarar seu índice utilizando a macro index e criá-lo utilizando o comando create_indexes.

O seguinte exemplo de código mostra como declarar e criar um índice ascendente denominado cuisine_index no campo cuisine na classe Restaurant :

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
index({ cuisine: 1}, { name: "cuisine_index", unique: false })
end
Restaurant.create_indexes

A macro index define o índice que você deseja criar e o comando create_indexes o cria na coleção restaurants .

Ao definir um índice, o primeiro objeto de hash contém o campo que você deseja indexar e sua direção. 1 representa um índice ascendente e -1 representa um índice descendente. O segundo objeto de hash contém opções de índice. Para saber mais sobre as opções de índice, consulte a seção Documentação da API .

Você pode usar nomes de campo com alias em definições de índice. Por exemplo, o seguinte código cria um índice no campo b , que é um alias do campo borough :

class Restaurant
include Mongoid::Document
field :borough, as: :b
index({ b: 1}, { name: "borough_index" })
end

Você pode definir um índice em campos de documento incorporado . O seguinte exemplo de código mostra como declarar um índice ascendente no campo street , que está incorporado no campo address no modelo Restaurant .

class Address
include Mongoid::Document
field :street, type: String
end
class Restaurant
include Mongoid::Document
embeds_many :addresses
index({"addresses.street": 1})
end

Você pode definir um índice composto em múltiplos campos. O seguinte exemplo de código mostra como declarar um índice composto que é ascendente no campo borough e descendente no campo name.

class Restaurant
include Mongoid::Document
field :name, type: String
field :borough, type: String
index({borough: 1, name: -1}, { name: "compound_index"})
end

Você pode definir um índice 2dsphere em campos que contêm objetos GeoJSON ou pares de coordenadas. O exemplo seguinte define um índice 2dsphere em um campo que contém objetos GeoJSON:

class Restaurant
include Mongoid::Document
field :location, type: Array
index({location: "2dsphere"}, { name: "location_index"})
end

Para obter mais informações sobre 2índices dsphere, consulte o guia 2dsphere no manual do MongoDB Server .

Para obter mais informações sobre o tipo GeoJSON, consulte o guia Objetos GeoJSON no manual do MongoDB Server .

Você pode definir um Enterprise Advanced em campos que não estão presentes em todos os documentos. O seguinte exemplo de código define um Enterprise Advanced no campo borough :

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
index({ borough: 1}, { sparse: true })
end

Para obter mais informações sobre índices esparsos, consulte o guia Índices esparsos no manual do MongoDB Server .

Você pode definir vários índices dentro do seu modelo e criá-los usando uma única chamada create_indexes. O exemplo a seguir mostra como criar vários índices ao mesmo tempo:

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
index({ name: 1})
index({ cuisine: -1})
end
Restaurant.create_indexes

Você pode soltar todos os índices em sua coleção. O exemplo seguinte elimina todos os índices no modelo Restaurant:

Restaurant.remove_indexes

Observação

Default Index

O MongoDB cria um índice padrão no campo _id durante a criação de uma collection. Este índice impede que os clientes insiram dois documentos com os mesmos valores para o campo _id. Você não pode descartar esse índice.

Você pode declarar e gerenciar índices do Atlas Search usando o Mongoid.

Para declarar um índice de pesquisa, use a macro search_index dentro do seu modelo. Para criar os índices de pesquisa declarados dentro de um modelo, use o comando create_search_indexes. O seguinte exemplo de código mostra como declarar e criar um índice de Atlas Search denominado my_search_index. O índice está nos campos name e cuisine e é dinâmico.

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
search_index :my_search_index,
mappings: {
fields: {
name: {
type: "string"
},
cuisine: {
type: "string"
}
},
dynamic: true
}
end
Restaurant.create_search_indexes

Para saber mais sobre a sintaxe para criar um índice do Atlas Search , consulte o guia Criar um índice do Atlas Search na documentação do MongoDB Atlas .

Para remover um índice do Atlas Search , use o comando remove_search_indexes. O seguinte exemplo de código mostra como remover um índice do Atlas Search da coleção restaurants:

Restaurant.remove_search_indexes

Você pode enumerar através de todos os índices do Atlas Search em sua coleção usando o comando search_indexes. O exemplo a seguir enumera todos os índices do Atlas Search na collection restaurants e imprime suas informações:

Restaurant.search_indexes.each { |index| puts index }

Para saber mais sobre o uso de índices no Mongoid, consulte a documentação do Mongoid::Indexable::ClassMethods.

Para saber mais sobre as opções de índice, consulte a documentação do Mongoid::Indexable::Validators::Options.

Para saber mais sobre como usar índices do Atlas Search no Mongoid, consulte a documentação do Mongoid::SearchIndexable::ClassMethods.