babie steps

作業療法記録

Rails3 対応 MongoDB ORM、Mongoid 詳解―インデックス

index マクロを使うことにより、ドキュメントにインデックスを定義することができます。:unique オプションをつけると、ユニークなインデックスを構築できます。オプションは必須ではありません。

class Person
  include Mongoid::Document
  field :ssn
  index :ssn, :unique => true
end


以下のようにして、エンベッドされたドキュメントにもインデックスを定義することができます。

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


複数フィールドに対してもインデックスを定義することができます。また、ソート順も定義できます。

  include Mongoid::Document
  field :first_name
  field :last_name
  index(
    [
      [ :first_name, Mongo::ASCENDING ],
      [ :last_name, Mongo::ASCENDING ]
    ],
    :unique => true
  )
end


インデックスは、ある程度時間がかかる場合、バックグラウンドで実行することもできます:

class Person
  include Mongoid::Document
  field :ssn
  index :ssn, :unique => true, :background => true
end


位置空間インデックスを定義する場合は、必ず、フィールドを配列としてください。

class Person
  include Mongoid::Document
  field :location, :type => Array
  index [[ :location, Mongo::GEO2D ]], :min => 200, :max => 200
end


リレーショナルな関連で、外部キーに対して、インデックスを定義することができます。

class Comment
  include Mongoid::Document
  referenced_in :post, :inverse_of => :comments, :index => true
  references_many \
    :users,
    :stored_as => :array,
    :inverse_of => :comments,
    :index => true
end


データベースにインデックスを作成したい時は、Rake タスクを呼び出してください:

rake db:create_indexes


モデルクラスがロードされたときに、自動的にインデックスを作成したい場合は、mongoid.yml のコンフィギュレーションオプションで設定することができます。ただし、プロダクション環境では推奨しません

defaults: &defaults
  autocreate_indexes: true


インデックスは以上です。