Posted at

Mongoid 特定Collectionにのみインデックスを作る

@koshi_life です。

Mongoid で特定Collectionにインデックスを作るやり方の備忘です。

参考: https://docs.mongodb.com/mongoid/master/tutorials/mongoid-indexes/

Mongoid では以下コマンドで各モデルで定義しているインデックスを作成することができます。

$ rake db:mongoid:create_indexes

しかしながら、既に投入されているデータにより、インデックス制約(ユニーク等)に違反している場合は以下のようにインデックス作成に失敗します。

$ rake db:mongoid:create_indexes

rake aborted!
Mongo::Error::OperationFailure: E11000 duplicate key error collection: test.users index: email_unique dup key: { : "yamada@example.com" } (11000)

ユニーク制約のデータ整理に時間がかかるなどで、

一旦インデックス定義可能なコレクションにのみインデックスを作成方法は以下です。

Model.create_indexes

$ rails c

irb(main):001:0> Message.create_indexes
=> true


モデルの例


  • Userモデル


user.rb

class User

include Mongoid::Document

field :name, type: String
field :email, type: String, default: ''

# インデックス: email は重複不可。空白はOK。
index({ email: 1 }, { name: 'email_unique', unique: true, sparse: true})

end



  • Messageモデル


message.rb

class Message

include Mongoid::Document

field :message_id
field :subject
field :body

belongs_to :user

# インデックス: user毎に message_id は一意とする
index({ user: 1, message_id: 1 }, { name: 'message_unique', unique: true })
end