@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