Docs Menu
Docs Home
/ / /
Mongoid
/

インデックスによるクエリの最適化

項目一覧

  • Overview
  • インデックスの宣言と作成
  • エイリアスと宣言インデックス
  • 埋め込みドキュメント フィールドでのインデックスの作成
  • 複合インデックスの作成
  • 地理空間インデックスの作成
  • スパース インデックスの作成
  • 複数のインデックスの作成
  • インデックスの削除
  • Atlas Search インデックス
  • Atlas Search インデックスの削除
  • Atlas Search インデックスの一覧表示
  • API ドキュメント

このガイドでは、Mongoid でインデックスを使用する方法を学習できます。インデックスは、 MongoDBがスキャンする必要があるドキュメント数を制限することで、クエリの効率を向上させることができます。 アプリケーションで特定のフィールドに対して繰り返しクエリが実行中場合は、それらのフィールドにインデックスを作成してクエリのパフォーマンスを向上させることができます。

このガイドの次のセクションでは、Mongoid を使用してさまざまなタイプのインデックスを宣言して作成する方法について説明します。 例では、sample_restaurantsデータベース内の restaurantsコレクションにマッピングする Restaurant モデルを使用します。 Mongoid を使用してこのデータベースとコレクションに接続する方法については、「 クイック スタート - Ruby on Rails 」または「 クイック スタート - Sinatra 」のガイドを参照してください。

Mongoid を使用する場合、index マイクロを使用してインデックスを宣言し、create_indexes コマンドを使用してインデックスを作成できます。

次のコード例は、 Restaurantクラスの cuisineフィールドに cuisine_index という名前の昇順インデックスを宣言して作成する方法を示しています。

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
index({ cuisine: 1}, { name: "cuisine_index", unique: false })
end
Restaurant.create_indexes

index マニュアルは作成するインデックスを定義し、create_indexes コマンドは restaurantsコレクションにそれを作成します。

インデックスを定義する場合、最初のハッシュオブジェクトにはインデックスを作成するフィールドとその方向が含まれます。 1 は昇順インデックスを表し、-1 は降順インデックスを表します。 2 番目のハッシュオブジェクトには、インデックスオプションが含まれています。 インデックスオプションの詳細については、 APIドキュメントのセクションを参照してください。

インデックス定義では、エイリアスのフィールド名を使用できます。 例、次のコードでは、boroughフィールドのエイリアスである bフィールドにインデックスが作成されます。

class Restaurant
include Mongoid::Document
field :borough, as: :b
index({ b: 1}, { name: "borough_index" })
end

埋め込みドキュメントフィールドにインデックスを定義できます。 次のコード例は、 Restaurant モデルの addressフィールドに埋め込まれている streetフィールドで昇順のインデックスを宣言する方法を示しています。

class Address
include Mongoid::Document
field :street, type: String
end
class Restaurant
include Mongoid::Document
embeds_many :addresses
index({"addresses.street": 1})
end

複数のフィールドに複合インデックスを定義できます。 次のコード例は、 boroughフィールドで昇順、nameフィールドで降順の複合インデックスを宣言する方法を示しています。

class Restaurant
include Mongoid::Document
field :name, type: String
field :borough, type: String
index({borough: 1, name: -1}, { name: "compound_index"})
end

GeoJSON オブジェクトまたは座標ペアを含むフィールドに 2dsphereインデックスを定義できます。 次の例では、 GeoJSON オブジェクトを含むフィールドに 2dsphereインデックスを定義します。

class Restaurant
include Mongoid::Document
field :location, type: Array
index({location: "2dsphere"}, { name: "location_index"})
end

2dsphere インデックスの詳細については、 MongoDB Serverマニュアルの2 dsphereガイドを参照してください。

GeoJSON タイプの詳細については、 MongoDB Serverマニュアルの 「GeoJSON オブジェクト」ガイドを参照してください。

すべてのドキュメントに存在しないフィールドに スパースインデックスを定義できます。 次のコード例では、 boroughフィールドにスパースインデックスを定義します。

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
index({ borough: 1}, { sparse: true })
end

スパース インデックスの詳細については、 MongoDB Serverマニュアルの「 スパース インデックス 」ガイドを参照してください。

モデル内で複数のインデックスを定義し、1 回の create_indexes 呼び出しを使用してそれらを作成できます。 次の例は、複数のインデックスを同時に作成する方法を示しています。

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
index({ name: 1})
index({ cuisine: -1})
end
Restaurant.create_indexes

コレクション内のすべてのインデックスを削除できます 。 次の例では、 Restaurant モデル内の すべての インデックスを削除しています。

Restaurant.remove_indexes

注意

Default Index

MongoDB は、コレクションの作成 中に _idフィールドにデフォルトのインデックスを作成します。 このインデックス、クライアントが _idフィールドに同じ値を持つ 2 つのドキュメントを挿入するのを防止できます。 このインデックスは削除できません。

Mongoid を使用して Atlas Search インデックスを宣言および管理できます。

検索インデックスを宣言するには、モデル内で search_index マイクロを使用します。 モデル内で宣言された検索インデックスを作成するには、create_search_indexes コマンドを使用します。 次のコード例は、 my_search_index という名前の Atlas Searchインデックスを宣言して作成する方法を示しています。 インデックスはnamecuisine フィールドにあり、動的です。

class Restaurant
include Mongoid::Document
field :name, type: String
field :cuisine, type: String
field :borough, type: String
search_index :my_search_index,
mappings: {
fields: {
name: {
type: "string"
},
cuisine: {
type: "string"
}
},
dynamic: true
}
end
Restaurant.create_search_indexes

Atlas Searchインデックスの作成構文の詳細については、 MongoDB Atlasドキュメントの「 Atlas Search インデックスの作成 」ガイドを参照してください。

Atlas Searchインデックスを削除するには、remove_search_indexes コマンドを使用します。 次のコード例は、 restaurantsコレクションから Atlas Searchインデックスを削除する方法を示しています。

Restaurant.remove_search_indexes

search_indexes コマンドを使用して、コレクション内のすべての Atlas Search インデックスを列挙できます。 次の例では、 restaurantsコレクション内のすべての Atlas Search インデックスを列挙し、その情報を出力します。

Restaurant.search_indexes.each { |index| puts index }

Mongoid でインデックスを使用する方法の詳細については、 Mongoid::Indexable::Classメソッドs ドキュメントを参照してください。

インデックスオプションの詳細については、 Mongoid::Indexable::Validator::Options のドキュメントを参照してください。

Mongoid で Atlas Search インデックスを使用する方法の詳細については、 Mongoid::SearchIndexable::Classメソッドs ドキュメントを参照してください。

戻る

データ関連付け