1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

@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
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?