Menu Docs
Página inicial do Docs
/ / /
Mongoid
/

Gerenciamento de índices

Nesta página

  • Especificando índices
  • Especificando índices de pesquisa no MongoDB Atlas
  • Tarefas de Rake de Gerenciamento de Índices
  • Gerenciando índices de Atlas Search no MongoDB Atlas
  • Diga ao Mongoid onde procurar modelos
  • Usando o Rake Tasks com aplicativos não Rails

Você pode definir índices em documentos usando a macro de índice. Forneça a chave do índice junto com uma direção. Opções adicionais podem ser fornecidas no segundo parâmetro de hash de opções:

class Person
include Mongoid::Document
field :ssn
index({ ssn: 1 }, { unique: true, name: "ssn_index" })
end

Você também pode definir índices em campos de documentos incorporados:

class Person
include Mongoid::Document
embeds_many :addresses
index "addresses.street" => 1
end

Você pode indexar em vários campos e fornecer orientações:

class Person
include Mongoid::Document
field :first_name
field :last_name
index({ first_name: 1, last_name: 1 }, { unique: true })
end

Os índices podem ser esparsos:

class Person
include Mongoid::Document
field :ssn
index({ ssn: -1 }, { sparse: true })
end

Para índices geoespaciais, certifique-se de que o campo que está sendo indexado é do tipo Array:

class Person
include Mongoid::Document
field :location, type: Array
index({ location: "2d" }, { min: -200, max: 200 })
end

Os índices podem ter como escopo um banco de dados específico:

class Person
include Mongoid::Document
field :ssn
index({ ssn: 1 }, { database: "users", unique: true, background: true })
end

Você pode usar nomes de campos com alias em definições de índice. Os nomes alternativos de campo também serão resolvidos nas seguintes opções: partial_filter_expression, weights, wildcard_projection.

class Person
include Mongoid::Document
field :a, as: :age
index({ age: 1 }, { partial_filter_expression: { age: { '$gte' => 20 } })
end

Observação

A expansão de aliases de nome de campo em opções de índice como partial_filter_expression é executada de acordo com o comportamento do servidor MongoDB 6.0. Versões futuras do servidor podem mudar a forma como interpretam essas opções, e a funcionalidade do Mongoid pode não suportar essas alterações.

O Mongoid pode definir índices em campos de "chave estrangeira" para associações. Isso só funciona na macro de associação em que a chave estrangeira está armazenada:

class Comment
include Mongoid::Document
belongs_to :post, index: true
has_and_belongs_to_many :preferences, index: true
end

Obsoleto: no MongoDB 4.0 e versões anteriores, os usuários podem controlar se desejam criar índices em primeiro plano (bloqueio) ou background (sem bloqueio, mas menos eficiente) usando a opção background .

class Person
include Mongoid::Document
field :ssn
index({ ssn: 1 }, { unique: true, background: true })
end

O valor padrão de background é controlado pelaopção de configuração background_indexing do Mongoid.

A opção background não tem efeito a partir do MongoDB 4.2.

Se o seu aplicativo estiver conectado ao MongoDB Atlas, você poderá declarar e gerenciar índices de pesquisa em seus modelos. (Esta funcionalidade está disponível apenas no MongoDB Atlas.)

Para declarar um índice de pesquisa, use a macro search_index em seu modelo:

class Message
include Mongoid::Document
search_index { ... }
search_index :named_index, { ... }
end

Os índices de pesquisa podem receber um nome explícito; isso será necessário se você tiver mais de um índice de pesquisa em um modelo.

Quando você quiser criar os índices no reconhecimento de data center, use a tarefa Rake db:mongoid:create_indexes fornecida:

$ rake db:mongoid:create_indexes

O Mongoid também fornece uma tarefa Rake para excluir todos os índices secundários.

$ rake db:mongoid:remove_indexes

Observação: a saída dessas tarefas do Rake vai para o registrador padrão configurado pelo Rails. Geralmente, é um arquivo como log/development.log e não é o resultado padrão.

Esses comandos de criação/remoção de índices também funcionam para apenas um modelo executado no console do Rails:

# Create indexes for Model
Model.create_indexes
# Remove indexes for Model
Model.remove_indexes

Se você definiu índices do Atlas Search em seu modelo, há tarefas de rastelo disponíveis para criar e remover esses índices do Atlas Search :

$ rake db:mongoid:create_search_indexes
$ rake db:mongoid:remove_search_indexes

Por padrão, a criação de índices do Atlas Search aguardará a criação dos índices, o que pode levar algum tempo. Se você quiser simplesmente deixar o banco de dados criar os índices em segundo plano, você pode definir a variável de ambiente WAIT_FOR_SEARCH_INDEXES para 0, assim:

$ rake WAIT_FOR_SEARCH_INDEXES=0 db:mongoid:create_search_indexes

Observe que a tarefa de remover índices do Atlas Search removerá todos os índices do Atlas Search de todos os modelos e deve ser usada com cuidado.

Você também pode adicionar e remover índices do Atlas Search para um único modelo invocando o seguinte em um console do Rails:

# Create all defined search indexes on the model; this will return
# immediately and the indexes will be created in the background.
Model.create_search_indexes
# Remove all search indexes from the model
Model.remove_search_indexes
# Enumerate all search indexes on the model
Model.search_indexes.each { |index| ... }

Para aplicativos não Rails, as tarefas de varredura do Mongoid procurarão modelos em ./app/models e ./lib/models. Para Rails, o Mongoid procurará em ./app/models (ou onde quer que você tenha configurado o Rails para procurar modelos). Se seus modelos estiverem em outro local, você precisará informar ao Mongoid onde procurá-los com Mongoid.model_paths=. Você pode fazer isso definindo-o no Rakefile do seu aplicativo:

# Rakefile
# keep the defaults, but add more paths to look for models
Mongoid.model_paths += [ "./src/models", "./lib/documents" ]
# or, override the defaults entirely
Mongoid.model_paths = [ "./src/models", "./lib/documents" ]

Certifique-se de que esses caminhos também estejam no caminho de carregamento do seu aplicativo. Por exemplo:

# Rakefile
$LOAD_PATHS.concat [ "./src/models", "./lib/documents" ]

As tarefas Rake do Mongoid são carregadas automaticamente em aplicativos Rails usando o Mongoid. Ao usar o Mongoid com um aplicativo não Rails, estas tarefas devem ser carregadas manualmente:

# Rakefile
require 'mongoid'
load 'mongoid/tasks/database.rake'

Se seu aplicativo usar o Bundler, você poderá exigir bundler/setup em vez de exigir explicitamente mongoid:

# Rakefile
require 'bundler/setup'
load 'mongoid/tasks/database.rake'

Voltar

Configuração da Coleção

Próximo

Configuração de fragmentação