Overview
このガイドでは、Mongoid でインデックスを使用する方法を学習できます。インデックスは、 MongoDBがスキャンする必要があるドキュメント数を制限することで、クエリの効率を向上させることができます。 アプリケーションで特定のフィールドに対して繰り返しクエリが実行中場合は、それらのフィールドにインデックスを作成してクエリのパフォーマンスを向上させることができます。
このガイドの次のセクションでは、Mongoid を使用してさまざまなタイプのインデックスを宣言して作成する方法について説明します。例では、sample_restaurantsデータベース内の restaurantsコレクションにマッピングする Restaurant モデルを使用します。Mongoid を使用してこのデータベースとコレクションに接続する方法については、「Mongoid とRuby on Rails の統合」または「Mongoid を 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ドキュメント 」セクションを参照してください。
注意
重複インデックス
Mongoid が一部のインデックス宣言を重複として誤ってラベル付けし、インデックス作成を妨げる可能性があります。このデフォルトの動作を変更して、インデックスの検証をサーバーにプッシュするには、Mongoid.allow_duplicate_index_declarations 構成オプションを true に設定します。その後、サーバーが重複インデックスを検出すると、エラーが発生します。詳細については、 アプリケーション構成ガイドの 「構成オプション」セクション を参照してください。
エイリアスと宣言インデックス
インデックス定義では、エイリアスのフィールド名を使用できます。 例、次のコードでは、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 つのドキュメントを挿入するのを防止できます。 このインデックスは削除できません。
MongoDB Search インデックス
Mongoid を使用して MongoDB 検索インデックスを宣言および管理できます。
検索インデックスを宣言するには、モデル内で search_index マイクロを使用します。モデル内で宣言された検索インデックスを作成するには、create_search_indexes コマンドを使用します。次のコード例は、my_search_index という名前のMongoDB 検索インデックスを宣言して作成する方法を示しています。インデックスは name と cuisine フィールドにあり、動的です。
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
MongoDB Search検索インデックスの作成構文の詳細については、MongoDB Atlasドキュメントの「MongoDB Search 検索インデックスの作成」ガイドを参照してください。
MongoDB Search インデックスの除去
MongoDB 検索インデックスを除くには、remove_search_indexes コマンドを使用します。次のコード例は、restaurantsコレクションからMongoDB検索インデックスを除く方法を示しています。
Restaurant.remove_search_indexes
MongoDB 検索インデックスの一覧表示
search_indexes コマンドを使用して、コレクション内のすべてのMongoDB 検索インデックスを列挙できます。次の例では、restaurantsコレクション内のすべてのMongoDB 検索インデックスを列挙し、その情報を出力します。
Restaurant.search_indexes.each { |index| puts index }
MongoDB ベクトル検索インデックス
ドキュメントの意味に基づいてクエリを実行するために、MongoDB ベクトル検索インデックスを宣言して作成できます。これらのインデックスを使用したクエリの実行方法を学ぶには、MongoDB ベクトル検索クエリの実行ガイドを参照してください。
このセクションの例では、sample_mflix データベースの embedded_movies コレクションにマップされ、plot_embedding フィールドにベクトル埋め込みを保存する Movie モデルを使用します。
ベクトルフィールドとベクトル検索インデックスを同時に宣言するには、モデル内で vector_field マクロを使用します。vector_field マクロは、ベクトル埋め込みを保存する Array フィールドを定義し、そのフィールドにベクトル検索インデックスを作成します。次のコード例では、1536 次元の vector_field という名前の plot_embedding が宣言されています。
class Movie include Mongoid::Document # Define `plot_embedding` as an Array field and create a vector search # index on it with `dimensions` set to 1536. vector_field :plot_embedding, dimensions: 1536 end Movie.create_search_indexes
Tip
類似関数の変更
デフォルトで、vector_field マクロは cosine 類似度関数を使用します。別の関数を使用するには、similarity オプションを dotProduct または euclidean に設定します。
インデックス定義をより詳細に制御するには、vector_search_index マクロを使用してフィールドとインデックスを別々に宣言します。次のコード例では、plot_embedding という名前の Array フィールドと、そのフィールドにおけるベクトル検索インデックスを宣言します。インデックスには、_id フィールドと year フィールドに filter フィールドが含まれているため、インスタンスレベルのベクトル検索クエリとフィルターされたベクトル検索クエリを実行できます。
class Movie include Mongoid::Document field :year, type: Integer field :plot_embedding, type: Array vector_search_index :plot_embedding_index, fields: [ { type: "vector", path: "plot_embedding", numDimensions: 1536, similarity: "cosine" }, { type: "filter", path: "_id" }, { type: "filter", path: "year" } ] end Movie.create_search_indexes
ベクトル検索インデックス定義のフィールドについて詳しく学ぶには、Atlas ドキュメントの「ベクトル検索のフィールドにインデックスを作成する方法」ガイドを参照してください。
API ドキュメント
Mongoid でインデックスを使用する方法の詳細については、 Mongoid::Indexable::Classメソッドs ドキュメントを参照してください。
インデックスオプションの詳細については、 Mongoid::Indexable::Validator::Options のドキュメントを参照してください。
Mongoid で MongoDB Search 検索インデックスと MongoDB ベクトル検索インデックスを使用する方法の詳細を学ぶには、Mongoid::SearchIndexable::ClassMethods ドキュメントを参照してください。