MongoDB とドライバー
定義
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
- MongoDB Atlas はクラウドでの MongoDB 配置のための完全管理サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
The createIndex() method has the following form:
db.collection.createIndex( <keys>, <options>, <commitQuorum>)
パラメーター
The createIndex() method takes the following parameters:
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | フィールドと値のペアを含むドキュメント。フィールドはインデックス キーで、値はそのフィールドのインデックスのタイプを表します。 フィールドに昇順インデックスを作成する場合、 アスタリスク( MongoDB は、次のような多彩なインデックス タイプをサポートしています。 詳細については、「インデックス タイプ」を参照してください。 ワイルドカード インデックスは、ユーザーがカスタム フィールドまたはコレクション内の多種多様なフィールドに対してクエリを実行するワークロードをサポートします。
|
| ドキュメント | Optional. A document that contains a set of options that controls the creation of the index. See Options for details. |
整数または文字列 | 任意。データを保持する投票レプリカセット ノードの最小数(コミットクォーラム)で、プライマリが 次の値をサポートします。
|
オプション
options ドキュメントには、インデックスの作成を制御する一連のオプションが含まれています。異なるインデックス タイプには、そのタイプに固有の追加オプションがある場合があります。
Multiple index options can be specified in the same document. However, if you specify multiple option documents the db.collection.createIndex() operation fails.
Consider the following db.collection.createIndex() operation:
db.collection.createIndex( { "a": 1 }, { unique: true, sparse: true, expireAfterSeconds: 3600 } )
オプションの仕様がこのように複数のドキュメントに分割されていた場合 ({ unique: true }, { sparse: true, expireAfterSeconds: 3600 })、インデックス作成操作は失敗していたでしょう。
すべてのインデックス タイプのオプション
以下のオプションは、特に指定がない限り、すべてのインデックス タイプで使用できます。
Parameter | タイプ | 説明 | |
|---|---|---|---|
| ブール値 | 任意。インデックス キーの値がインデックスの既存値と一致するドキュメントの挿入または更新をコレクションが受け入れないように、ユニークインデックスを作成します。 ユニークインデックスを作成するには、 このオプションはハッシュされたインデックスには使用できません。 | |
| string | 任意。インデックスの名前。指定しない場合、MongoDB はインデックス フィールドの名前とソート順序を連結してインデックス名を生成します。 | |
| ドキュメント | 任意。指定すると、インデックスはフィルター式に一致するドキュメントのみを参照します。詳細については、「部分インデックス」を参照してください。 フィルター式には、次の要素を含めることができます。
MongoDB ではすべてのインデックス タイプで | |
| ブール値 | 任意。 次のインデックス タイプはデフォルトでスパースであり、このオプションを無視します。
部分インデックスには、sparse index 機能のスーパーセットがあります。アプリケーションに特別な要件がない限り、sparse index ではなく、部分インデックスを使用してください。 | |
| integer | 任意。MongoDB がこのコレクション内のドキュメントを保持する期間を制御するための有効期間(TTL)の値を秒単位で指定します。このオプションは TTL インデックスにのみ適用されます。詳細については、「TTL によるコレクションのデータ期限設定」を参照してください。 MongoDB 5.0 より前のバージョンで作成された TTL インデックスを使用する場合、または MongDB 5.0 で作成されたデータを 5.0 より前のインストールと同期する場合は、「NaN を使用して構成されたインデックス」を参照して誤った構成の問題を回避してください。 TTLインデックスの | |
ブール値 | 任意。インデックスがクエリ プランナーから非表示かどうかを決定するブール値。非表示インデックスは、クエリプランの選択において評価されません。 デフォルトは、 | ||
| ドキュメント | 任意。インデックス作成時に、インデックス単位でストレージエンジンを構成できるようにします。
インデックスの作成時に指定されたストレージエンジン構成オプションは、異なるストレージエンジンを使用するノードのあるレプリカセットをサポートするために、レプリケーション中に検証され、oplog に記録されます。 |
照合のオプション
Parameter | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ドキュメント | 任意。インデックスの照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 コレクション レベルで照合を指定した場合、次のようになります。
照合オプションの構文は次のとおりです。 照合を指定する場合、 |
次のインデックスは単純なバイナリ比較のみをサポートしており、照合はサポートしていません。
Tip
単純ではない照合順序を持つコレクションに text または 2d インデックスを作成するには、インデックスの作成時、明確に {collation: {locale: "simple"} } を指定する必要があります。
照合とインデックスの使用
コレクション レベルで照合を指定した場合、次のようになります。
インデックスの作成時に照合を指定しない場合、MongoDB はコレクションのデフォルトの照合でインデックスを作成します。
インデックスの作成時に照合を指定する場合、MongoDB は指定された照合でインデックスを作成します。
Tip
照合の strength を1 または 2 に指定すると、大文字と小文字を区別しないインデックスを作成できます。照合の strength が 1 のインデックスは、発音と大文字・小文字の両方を区別しません。
同じキーに対して、異なる照合を持つ複数のインデックスを作成できます。同じキー パターンで照合が異なるインデックスを作成するには、ユニークインデックス名を設定する必要があります。
文字列の比較にインデックスを使用するには、操作で同じ照合も指定する必要があります。つまり、照合順序を持つインデックスでは、操作で異なる照合順序が指定されている場合、インデックス付きフィールドで文字列比較を実行する操作をサポートできません。
警告
照合対応のインデックスキーは、照合のないインデックスのインデックスキーよりも大きくなる可能性があります。これは、照合付きで構成されたインデックスが ICU 照合キーを使用して並べ替え順序を実現するためです。
text インデックスのオプション
次のオプションはテキストインデックスのみに使用できます。
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | 任意。 テキストインデックスの場合、フィールドと重みを含むドキュメントが組み合わされます。 重みは1から99までの整数で、 999はスコアに関して他のインデックス付きフィールドと比較したフィールドの重要性を示します。 重みはインデックス フィールドの一部またはすべてに指定できます。 スコアを調整するには、「自己管理型配置のテキスト検索結果への重みの割り当て」を参照してください。 デフォルト値は MongoDB 5.0 以降、重みオプションはテキスト インデックスにのみ使用できます。 |
| string | 任意。テキスト インデックスで、ストップワードのリストと ステマーとトークナイザのルールを決定する言語。利用可能な言語については自己管理型配置のテキスト検索言語を、詳細と例については自己管理型MongoDBのテキストインデックスの言語の指定を参照してください。デフォルト値は |
| string | 任意。テキスト インデックスの場合、ドキュメントの上書き言語を含む、コレクション内のドキュメントのフィールドの名前です。デフォルト値は |
| integer | 任意。 使用可能なバージョンについては、「自己管理型配置のテキストインデックス バージョン 」を参照してください。 |
2dsphere インデックスのオプション
次のオプションは 2dsphere インデックスのみに使用できます。
Parameter | タイプ | 説明 |
|---|---|---|
| integer | 任意。 使用可能なバージョンについては、「2dsphere インデックス」を参照してください。 |
2d インデックスのオプション
次のオプションは 2d インデックスに対してのみ使用できます。
インデックスのオプションwildcard
ワイルドカード インデックスは wildcardProjection オプションを使用できます。
Parameter | タイプ | 説明 | |||||||
|---|---|---|---|---|---|---|---|---|---|
| ドキュメント | 任意。特定のフィールドパスを ワイルドカード インデックス に含めたり除外したりできるようにします。 このオプションは、すべてのドキュメント フィールドにワイルドカード インデックスを作成する場合にのみ有効です。特定のフィールドパスとそのサブフィールドにワイルドカード インデックスを作成する場合には、
ただし、ワイルドカード フィールドと通常の(ワイルドカード以外の)フィールドに同じフィールドを含むインデックスを定義することはできません。 インデックスを正しく定義するには、
|
詳しくは以下を参照してください。
動作
既存インデックスの再作成
If you call db.collection.createIndex() for an index that already exists, MongoDB does not recreate the index.
インデックス オプション
照合非対応および非表示オプション
照合オプションは除き、1 つのインデックスオプションセットを使用してインデックスを作成し、その後別のインデックスオプションを使用して同じインデックスを再作成しようとすると、MongoDB はオプションを変更せず、インデックスを再作成しません。
非表示オプションはインデックスを削除して再度作成することなく変更できます。詳細は、「非表示オプション」を参照してください。
To change the other index options, drop the existing index with db.collection.dropIndex() before running db.collection.createIndex() with the new options.
照合オプション
同じキーに対して、異なる照合を持つ複数のインデックスを作成できます。同じキー パターンで照合が異なるインデックスを作成するには、ユニークインデックス名を設定する必要があります。
非表示オプション
To hide or unhide existing indexes, you can use the following mongosh methods:
たとえば、
インデックスの
hiddenオプションをtrueに変更するには、db.collection.hideIndex()メソッドを使用します。db.restaurants.hideIndex( { borough: 1, ratings: 1 } ); インデックスの
hiddenオプションをfalseに変更するには、db.collection.unhideIndex()メソッドを使用します。db.restaurants.unhideIndex( { borough: 1, city: 1 } );
トランザクション
トランザクションがクロスシャード間書き込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。
To use db.collection.createIndex() in a transaction, the transaction must use read concern "local". If you specify a read concern level other than "local", the transaction fails.
インデックス構築
バージョン7.1で変更。
MongoDB 7.1 以降では、インデックス構築でのエラー報告が高速化され、障害回復力が高まります。 新しいindexBuildMinAvailableDiskSpaceMBパラメータを使用して、インデックスビルドに必要な最小ディスク容量を設定することもできます。これにより、ディスク容量が低すぎる場合はインデックスビルドが停止します。
次の表は、MongoDB 7.1 以降と以前のバージョンのインデックス構築動作を比較したものです。
MongoDB 7.1 以降の 動作 | 以前の MongoDB バージョンでの動作 |
|---|---|
重複キー エラーを除く、コレクションスキャンフェーズ中に見つかったインデックス エラーは直ちに返され、その後インデックスのビルドは停止します。 以前の MongoDB バージョンでは、インデックスビルドの終了間際に発生するコミットフェーズでエラーが返されます。 MongoDB 7.1 は、インデックス エラーを迅速に診断するのに役立ちます。 たとえば、互換性のないインデックス値の形式が見つかった場合は、すぐにエラーが返されます。 | MongoDB 7.1 と比較して、インデックス構築エラーが返されるまでに長い時間がかかる可能性があります。このエラーはコミットフェーズのインデックス構築の終了間して返されるためです。 |
インデックス構築エラーにより、セカンダリ ノードがクラッシュする可能性があります。 | |
インデックス ビルドのためのディスク領域の管理を改善しました。 使用可能なディスク容量が | 使用可能なディスク容量が不足しても、インデックスの構築は停止しません。 |
コミットクォーラム
注意
FeatureCompatibilityVersion 4.4 以上が必要です。
レプリカセット全体でインデックス構築を同時に開始するには、レプリカセットまたはシャーディングされたクラスター内の各 mongod は、featureCompatibilityVersion を少なくとも 4.4 に設定する必要があります。
レプリカセットまたはシャーディングされたクラスター上のインデックスは、データを保持するすべてのレプリカセット ノードで同時に構築されます。シャーディングされたクラスターの場合、インデックス構築は、インデックスが作成されるコレクションのデータを含むシャードでのみ行われます。プライマリは、インデックスを使用可能とマークする前に、自身を含む最小限のデータを保持する voting ノード(コミットクォーラム)でインデックス構築を完了する必要があります。詳細については、「レプリケートされた環境でのインデックス構築」を参照してください。
To set the commit quorum, use createIndex() to specify the commitQuorum value.
commitQuorum は、データを保持する投票ノードの数、またはプライマリがコミットを実行する前にプライマリを含めてどの投票ノードがインデックス構築のコミット準備をしておく必要があるかを指定します。コミットクォーラムのデフォルトである votingMembers は、データを保持するすべてのノードを指します。
例
このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
注意
moviesコレクション内のdocumentには、ここに表示されていない追加フィールドが含まれています。
単一フィールドでの昇順インデックスの作成
次の例では、フィールド orderDate に昇順のインデックスを作成しています。
db.collection.createIndex( { orderDate: 1 } )
If the keys document specifies more than one field, then createIndex() creates a compound index.
複数のフィールドでのインデックスの作成
次の例では、year、runtime、title フィールドに複合インデックスを作成しています。
db.movies.createIndex( { year: 1, runtime: 1, title: 1 } )
次の例では、state フィールド(昇順)と zipcode フィールド(ハッシュ)に複合インデックスを作成します。
db.collection.createIndex( { "state" : 1, "zipcode" : "hashed" } )
ハッシュインデックスの詳細については、ハッシュインデックスを参照してください。
照合を使用したインデックスの作成
次のコードを使用して、sample_mflixデータベースの moviesコレクションに、string 比較用の照合ロケール"fr" を持つインデックスを作成します。
db.movies.createIndex( { title: 1 }, { collation: { locale: "fr" } } )
インデックスと同じ照合を指定する次のクエリでは、インデックスを使用できます。
db.movies.find( { title: "Les Misèrables" }, { title: 1, year: 1 } ).collation( { locale: "fr" } )
ただし、デフォルトで「シンプル」な binary コレータを使用する次の クエリ操作、インデックスを使用できず、COLLSCAN が必要です。
db.movies.find( { title: "Les Misèrables" }, { title: 1 , year: 1 } )
インデックス プレフィックスキーが文字列、配列、および埋め込みドキュメントではない複合インデックスの場合でも、異なる照合を指定する操作では、インデックスを使用してインデックス プレフィックスキーの比較をサポートできます。
例、次のコードを使用して、sample_mflixデータベースの moviesコレクションに数値フィールド year と metacritic と stringフィールドtitle を指定する複合インデックスを作成できます。このインデックスでは、string 比較用の照合ロケール"fr" も指定します。
db.movies.createIndex( { year: 1, metacritic: 1, title: 1 }, { collation: { locale: "fr" } } )
文字列の比較に "simple" バイナリ照合を使用する次の操作では、インデックスを使用できます。
db.movies.find( { year: 2012 }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
db.movies.find( { year: 2012, metacritic: { $gt: Decimal128( "50" ) } }, { title: 1, year: 1, metacritic: 1 } ).sort( { title: 1 } )
次の操作では、"simple" バイナリ照合を使用してインデックス付きの title フィールドで文字列を比較しますが、クエリの year: 2012 部分の実行についてはインデックスが使用できます。
db.movies.find( { year: 2012, title: "Les Misèrables" }, { year: 1, title: 1 } )
インデックスでインデックス が使用されているかどうかを確認するには、 explain() オプションを指定してクエリを実行します。
重要
ドキュメントキーとの照合(埋め込みドキュメントのキーを含む)では、単純なバイナリ比較が使用されます。つまり、"type.cafe" のようなキーのクエリは、キー "type.cafe" と一致しません。strength パラメータに設定した値に関係なく、キー "foo.bar" と一致しません。
単一フィールドパスでのワイルドカード インデックスの作成
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Jeans", product_attributes: { price: { cost: 29.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Sweater", product_attributes: { washable: true, size: [ "small", "medium", "large" ] } } ] )
次の操作を実行すると、product_attributes フィールドでワイルドカード インデックスが作成されます。
use inventory db.products_catalog.createIndex( { "product_attributes.$**" : 1 } )
このワイルドカード インデックスを使用すると、MongoDB はproduct_attributes のすべてのスカラー値をインデックス化します。フィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
ワイルドカード インデックスは、product_attributes またはそのネストされたフィールドに対する任意の単一フィールド クエリをサポート可能です。
db.products_catalog.find( { "product_attributes.washable" : true } ) db.products_catalog.find( { "product_attributes.maxSize" : { $gt : 20 } } ) db.products_catalog.find( { "product_attributes.colors" : { $eq: "blue" } } )
すべてのフィールドパスでのワイルドカード インデックスの作成
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Jeans", product_attributes: { price: { cost: 29.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Sweater", product_attributes: { washable: true, size: [ "small", "medium", "large" ] } } ] )
次の操作を実行すると、すべてのスカラー フィールド(_id フィールドを除く)にワイルドカード インデックスが作成されます。
use inventory db.products_catalog.createIndex( { "$**" : 1 } )
このワイルドカード インデックスを使用すると、MongoDB はコレクション内の各ドキュメントのすべてのスカラー フィールドにインデックスを作成します。特定のフィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
作成されたインデックスは、コレクションのドキュメント内の任意のフィールドに対するクエリをサポートできます。
db.products_catalog.find( { "product_price" : { $lt : 25 } } ) db.products_catalog.find( { "product_attributes.colors" : { $eq: "blue" } } )
ワイルドカード インデックス カバレッジへの特定フィールドの含有
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Jeans", product_attributes: { price: { cost: 29.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Sweater", product_attributes: { washable: true, size: [ "small", "medium", "large" ] } } ] )
次の操作ではワイルドカード インデックスを作成し、wildcardProjection オプションを使用して product_attributes.colors および product_attributes.material フィールドのスカラー値のみをインデックスに含めます。
use inventory db.products_catalog.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "product_attributes.colors" : 1, "product_attributes.material" : 1 } } )
The pattern "$**" includes all fields in the document. Use the wildcardProjection field to limit the index to fields you specify. For complete documentation on wildcardProjection, see Options for wildcard indexes.
フィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはそのフィールドを再帰処理して、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
ワイルドカード インデックスは、wildcardProjection に含まれる任意のスカラーフィールドに対するクエリをサポートします。
db.products_catalog.find( { "product_attributes.colors" : { $eq: "Blue" } } ) db.products_catalog.find( { "product_attributes.material" : "Cotton" } )
注意
ワイルドカード インデックスは、_id フィールドを明示的に含める場合を除き、wildcardProjection ドキュメントに包含・除外ステートメントを混在させることはできません。wildcardProjection の詳細については、パラメーターのドキュメントを参照してください。
ワイルドカード インデックス カバレッジからの特定フィールドの除外
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Jeans", product_attributes: { price: { cost: 29.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Sweater", product_attributes: { washable: true, size: [ "small", "medium", "large" ] } } ] )
この例では、ワイルドカード インデックスと wildcardProjection ドキュメントを使用して、コレクション内の各ドキュメントのスカラー フィールドにインデックスを作成します。
ワイルドカード インデックスでは、product_attributes.colors フィールドと product_attributes.material フィールドは除外されます。
use inventory db.products_catalog.createIndex( { "$**" : 1 }, { "wildcardProjection" : { "product_attributes.colors" : 0, "product_attributes.material" : 0 } } )
ワイルドカード パターン "$**" にはドキュメント内のすべてのフィールドが含まれます。ただし、wildcardProjection フィールドは指定されたフィールドをインデックスから除外します。
For complete documentation on wildcardProjection, see Options for wildcard indexes.
フィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
インデックスは、wildcardProjection によって除外されるものを除くすべてのスカラー フィールドに対するクエリをサポートできます。
db.products_catalog.find( { "product_attributes.maxSize" : { $gt: 25 } } ) db.products_catalog.find( { "product_attributes.washable" : true } )
注意
ワイルドカード インデックスは、_id フィールドを明示的に含める場合を除き、wildcardProjection ドキュメントに包含・除外ステートメントを混在させることはできません。wildcardProjection の詳細については、パラメーターのドキュメントを参照してください。
コミットクォーラムを使用したインデックスの作成
The following operation creates an index with a commit quorum of "majority", or a simple majority of data-bearing voting members:
db.getSiblingDB("examples").invoices.createIndex( { "invoices" : 1 }, { }, "majority" )
プライマリがインデックス構築を準備完了とマークするには、データを保持する単純過半数の投票ノードがインデックス構築をコミットするために「投票」済みである必要があります。インデックス構築と投票プロセスの詳細については、「レプリケートされた環境でのインデックス構築」を参照してください。
詳細情報
MongoDB のインデックスとインデックス作成の詳細については、このマニュアルの インデックス セクションを参照してください。
db.collection.getIndexes()ではコレクションの既存インデックスの仕様を参照できます。textインデックスの作成の詳細については、「 自己管理型配置のテキスト インデックス 」を参照してください。地理空間クエリ用の 地理空間インデックス。
データの有効期限を示す TTL インデックス。