Navigation
This version of the documentation is archived and no longer supported.

Indexes

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
←   Validation Sharding  →