Gerenciamento de índices
Nesta página
Especificando índices
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.
Especificando índices de pesquisa no MongoDB Atlas
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.
Tarefas de Rake de Gerenciamento de Índices
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
Gerenciando índices de Atlas Search no MongoDB Atlas
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| ... }
Diga ao Mongoid onde procurar modelos
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" ]
Usando o Rake Tasks com aplicativos não Rails
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'