Navigation

Index Management

Specifying Indexes

You can define indexes on documents using the index macro. Provide the key for the index along with a direction. Additional options can be supplied in the second options hash parameter:

class Person
  include Mongoid::Document
  field :ssn

  index({ ssn: 1 }, { unique: true, name: "ssn_index" })
end

You can define indexes on embedded document fields as well:

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

You can index on multiple fields and provide direction:

class Person
  include Mongoid::Document
  field :first_name
  field :last_name

  index({ first_name: 1, last_name: 1 }, { unique: true })
end

Indexes can be sparse:

class Person
  include Mongoid::Document
  field :ssn

  index({ ssn: -1 }, { sparse: true })
end

Indexes can be specified to be created in the background in cases where the collection is large and index creation may take a long time:

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

If the background_indexing configuration option is true, the indexes are created in the background unless the background: false option is provided.

Deprecated: When using MongoDB 2.6, you can drop the duplicate entries for unique indexes that are defined for a column that might already have duplicate values by specifying the drop_dups option:

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

The drop_dups option has been removed as of MongoDB 3.0.

For geospatial indexes, make sure the field being indexed is of type Array:

class Person
  include Mongoid::Document
  field :location, type: Array

  index({ location: "2d" }, { min: -200, max: 200 })
end

Indexes can be scoped to a specific database:

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

Mongoid can define indexes on “foreign key” fields for associations. This only works on the association macro that the foreign key is stored on:

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

Index Management Rake Tasks

When you want to create the indexes in the database, use the provided db:mongoid:create_indexes Rake task:

$ rake db:mongoid:create_indexes

Mongoid also provides a Rake task to delete all secondary indexes.

$ rake db:mongoid:remove_indexes

Note: the output of these Rake tasks goes to the default logger configured by Rails. This is usually a file like log/development.log and not standard output.

These create/remove indexes commands also works for just one model by running in Rails console:

# Create indexes for Model
Model.create_indexes

# Remove indexes for Model
Model.remove_indexes

Using Rake Tasks With Non-Rails Applications

Mongoid’s Rake tasks are automatically loaded in Rails applications using Mongoid. When using Mongoid with a non-Rails application, these tasks must be loaded manually. This can be achieved by loading them in the Rakefile and providing an :environment task to load your application’s models:

# Rakefile

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

task :environment do
  # Require/load your application's models here
end

If your application uses Bundler, you can require bundler/setup instead of explicitly requiring mongoid:

# Rakefile

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

task :environment do
  # Require/load your application's models here
end