db.collection.createIndexes()
MongoDB とドライバー
このページでは、 mongosh
メソッドについて説明します。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
定義
db.collection.createIndexes( [ keyPatterns ], options, commitQuorum )
コレクションに 1 つ以上のインデックスを作成します。
レプリカセットおよびシャーディングされたクラスターへのインデックス ビルドの影響を最小限に抑えるには、「 レプリカセットでのローリング インデックス ビルド 」で説明されているローリング インデックスのビルド手順を使用してください。
db.collection.createIndexes()
は以下のパラメーターを取ります。Parameterタイプ説明keyPatterns
ドキュメントインデックス仕様ドキュメントを含む配列。各ドキュメントには、フィールドと値のペアが含まれています。フィールドはインデックスキーで、値はそのフィールドのインデックスのタイプを表します。フィールドの昇順インデックスの場合は
1
の値を指定し、降順インデックスの場合は-1
の値を指定します。MongoDB は、テキスト、地理空間、ハッシュインデックスなど、いくつかの異なるインデックス タイプをサポートしています。 詳細については、「インデックス タイプ」を参照してください。
バージョン 4.2 での変更: MongoDB 4.2ワイルドカード インデックスは、ユーザーがカスタム フィールドまたはコレクション内の多種多様なフィールドに対してクエリを実行するワークロードをサポートします。
ドキュメント内のすべてのフィールドとサブフィールドにワイルドカード インデックスを作成するには、インデックス キーとして
{ "$**" : 1 }
を指定します。 ワイルドカード インデックスの作成時に、降順のインデックス キーを指定することはできません。任意の
wildcardProjection
パラメータを使用して、特定のフィールドとそのサブフィールドをインデックスに含める、または除外することもできます。ワイルドカード インデックスでは、デフォルトで
_id
フィールドが省略されます。_id
フィールドをワイルドカード インデックスに含めるには、wildcardProjection
ドキュメントに明示的に含める必要があります。{ "wildcardProjection" : { "_id" : 1, "<field>" : 0|1 } } _id
フィールドを明示的に含める場合を除き、wildcardProjection
ドキュメントに含むステートメントと除外するステートメントを組み合わせることはできません。特定のフィールドとそのサブパスにワイルドカード インデックスを作成するには、インデックス キーとしてそのフィールドへの完全パスを指定し、パスに
"$**"
を追加します。{ "path.to.field.$**" : 1 }
ワイルドカード インデックスの作成時に、降順のインデックス キーを指定することはできません。
パス固有のワイルドカード インデックス構文は
wildcardProjection
オプションと互換性がありません。 指定されたパス上で、追加の包含または除外を指定することはできません。
ワイルドカード インデックス キーは、上記の構文のいずれかを使用する必要があります。 たとえば、複合インデックス キーは指定できません。 作成に関する制限を含む、ワイルドカード インデックスに関する詳細なドキュメントについては、「ワイルドカード インデックスの制限 」を参照してください。
ワイルドカード インデックスを作成するには、
mongod
featureCompatibilityVersionが4.2
である必要があります。 fCV を設定する手順については、「 MongoDB 5.0 配置で機能の互換性バージョンを設定する 」を参照してください。ワイルドカード インデックスの作成の詳細については、「ワイルドカード インデックス 」を参照してください。
options
ドキュメント任意。 インデックスの作成を制御する一連のオプションを含むドキュメント。 詳細については、「オプション 」を参照してください。整数または文字列任意。データを保持する投票レプリカセット ノードの最小数(コミットクォーラム)で、プライマリが
indexes
を準備完了とマークする前に、インデックス構築の成功を報告する必要があるもの(プライマリを含む)を指します。「投票」ノードとは、members[n].votes
が0
より大きい任意のレプリカセット ノードです。次の値をサポートします。
"votingMembers"
- データを保持するすべての投票レプリカセット ノード(デフォルト)。"majority"
- データを保持する単純過半数の投票レプリカセット ノード。<int>
- データを保持する特定数の投票レプリカセット ノード。0
- クォーラム投票の動作を無効にします。ノードはインデックス構築を同時に開始しますが、インデックス構築を完了する前にクォーラムの投票や待機は行いません。0
のコミットクォーラムでインデックス構築を開始した場合、後でsetIndexCommitQuorum
を使用してコミットクォーラムを変更することはできません。レプリカセットのタグ名。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、 「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
Stable API
Stable API V1 を使用する場合
options
ドキュメントでは次のフィールドは指定できません。background
bucketSize
sparse
storageEngine
geoHaystackまたはテキストインデックスは作成できません。
上記でサポートされていないインデックス タイプは、 厳密モード の クエリ プランナー によって無視されます。たとえば、
cursor.hint()
でsparse
インデックスを使用しようとすると、次のBadValue
エラーが発生します。planner returned error :: caused by :: hint provided does not correspond to an existing index
オプション
options
ドキュメントには、インデックスの作成を制御する一連のオプションが含まれています。異なるインデックス タイプには、そのタイプに固有の追加オプションがある場合があります。
インデックス オプションは同一ドキュメント内で複数指定できます。 ただし、複数のオプション ドキュメントを指定すると、 db.collection.createIndexes()
操作は失敗します。
次の db.collection.createIndexes()
操作を考えてみましょう。
db.collection.createIndexes( [ { "a": 1 }, { "b": 1 } ], { unique: true, sparse: true, expireAfterSeconds: 3600 } )
オプションの仕様がこのように複数のドキュメントに分割されていた場合 ({ unique: true }, { sparse: true, expireAfterSeconds: 3600 }
)、インデックス作成操作は失敗していたでしょう。
重要
db.collection.createIndexes()
にオプションを指定すると、指定されたすべてのインデックスにオプションが適用されます。 たとえば、 照合 オプションを指定すると、作成されたすべてのインデックスにその照合が含まれます。
db.collection.createIndexes()
は、互換性のないオプションや多すぎる引数でインデックスを作成しようとするとエラーを返します。詳しくは、オプションの説明を参照してください。
すべてのインデックス タイプのオプション
以下のオプションは、特に指定がない限り、すべてのインデックス タイプで使用できます。
Parameter | タイプ | 説明 | |
---|---|---|---|
unique | ブール値 | ||
name | string | 任意。インデックスの名前。指定しない場合、MongoDB はインデックス フィールドの名前とソート順序を連結してインデックス名を生成します。 注意MongoDB 4.2 での変更MongoDB は最大127バイトのインデックス名の長さ制限を削除します。
| |
partialFilterExpression | ドキュメント | 任意。指定すると、インデックスはフィルター式に一致するドキュメントのみを参照します。詳細については、「部分インデックス」を参照してください。 フィルター式には、次の要素を含めることができます。 MongoDB ではすべてのインデックス タイプで バージョン 3.2 で追加。 | |
sparse | ブール値 | 任意。 次のインデックス タイプはデフォルトでスパースであり、このオプションを無視します。
Tip部分インデックスは、スパースインデックスの機能のスーパーセットを提供します。アプリケーションに特別な要件がない限り、スパースインデックスでなく、部分インデックスを使用してください。 | |
expireAfterSeconds | integer | 任意。MongoDB がこのコレクション内のドキュメントを保持する期間を制御するための有効期間(TTL)の値を秒単位で指定します。このオプションは TTL インデックスにのみ適用されます。詳細については、「TTL によるコレクションのデータ期限設定」を参照してください。 MongoDB 5.0 より前のバージョンで作成された TTL インデックスを使用する場合、または MongDB 5.0 で作成されたデータを 5.0 より前のインストールと同期する場合は、「NaN を使用して構成されたインデックス」を参照して誤った構成の問題を回避してください。 TTLインデックスの | |
ブール値 | 任意。インデックスがクエリ プランナーから非表示かどうかを決定するブール値。非表示インデックスは、クエリプランの選択において評価されません。 デフォルトは、 | ||
storageEngine | ドキュメント | 任意。作成されたインデックスのストレージ エンジンをユーザーが設定できるようにします。
インデックスの作成時に指定されたストレージエンジン構成オプションは、異なるストレージエンジンを使用するノードのあるレプリカセットをサポートするために、レプリケーション中に検証され、oplog に記録されます。 |
照合のオプション
Parameter | タイプ | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
collation | ドキュメント | 任意。インデックスの照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 コレクション レベルで照合を指定した場合、次のようになります。
照合オプションの構文は次のとおりです。
照合を指定する場合、 バージョン 3.4 で追加。 |
次のインデックスは単純なバイナリ比較のみをサポートしており、照合はサポートしていません。
text indexes,
2dインデックス、
geoHaystack indexes.
Tip
単純ではない照合順序を持つコレクションにtext
、 2d
、またはgeoHaystack
インデックスを作成するには、インデックスの作成時、 {collation: {locale: "simple"} }
を明示的に指定する必要があります。
照合とインデックスの使用
コレクション レベルで照合を指定した場合、次のようになります。
インデックスの作成時に照合を指定しない場合、MongoDB はコレクションのデフォルトの照合でインデックスを作成します。
インデックスの作成時に照合を指定する場合、MongoDB は指定された照合でインデックスを作成します。
Tip
照合の strength
を1
または 2
に指定すると、大文字と小文字を区別しないインデックスを作成できます。照合の strength
が 1
のインデックスは、発音と大文字・小文字の両方を区別しません。
同じキーに対して、異なる照合を持つ複数のインデックスを作成できます。同じキー パターンで照合が異なるインデックスを作成するには、ユニークインデックス名を設定する必要があります。
文字列の比較にインデックスを使用するには、操作で同じ照合も指定する必要があります。つまり、照合順序を持つインデックスでは、操作で異なる照合順序が指定されている場合、インデックス付きフィールドで文字列比較を実行する操作をサポートできません。
警告
照合が構成されたインデックスは、並べ替え順序を実現するために ICU 照合キーを使用するため、照合対応のインデックス キーは、照合のないインデックスのインデックス キーよりも大きくなる可能性があります。
たとえば、コレクション myColl
には、照合ロケール "fr"
を持つ文字列フィールド category
のインデックスがあります。
db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )
インデックスと同じ照合を指定する次のクエリ操作では、インデックスを使用できます。
db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )
ただし、デフォルトで「シンプル」なバイナリー コレータを使用する次のクエリ操作では、インデックスを使用できません。
db.myColl.find( { category: "cafe" } )
インデックス プレフィックスキーが文字列、配列、および埋め込みドキュメントではない複合インデックスの場合でも、異なる照合を指定する操作では、インデックスを使用してインデックス プレフィックスキーの比較をサポートできます。
たとえば、myColl
コレクションには、数値フィールドの score
、price
、および 文字列フィールドの category
の複合インデックスがあります。このインデックスは、文字列比較用の照合ロケール "fr"
を使用して作成されます。
db.myColl.createIndex( { score: 1, price: 1, category: 1 }, { collation: { locale: "fr" } } )
文字列の比較に "simple"
バイナリ照合を使用する次の操作では、インデックスを使用できます。
db.myColl.find( { score: 5 } ).sort( { price: 1 } ) db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )
次の操作では、"simple"
バイナリ照合を使用してインデックス付きの category
フィールドで文字列を比較しますが、クエリの score: 5
部分の実行についてはインデックスが使用できます。
db.myColl.find( { score: 5, category: "cafe" } )
重要
ドキュメント キーとの照合(埋め込みドキュメントのキーを含む)では、単純なバイナリ比較が使用されます。つまり、"foo.bár" のようなキーのクエリは、strength パラメーターに設定した値にかかわらず、キー "foo.bar" と一致しません。
インデックスのオプションtext
次のオプションはテキストインデックスのみに使用できます。
Parameter | タイプ | 説明 |
---|---|---|
weights | ドキュメント | 任意。 テキストインデックスの場合、フィールドと重みを含むドキュメントが組み合わされます。 重みは1から99までの整数で、 999はスコアに関して他のインデックス付きフィールドと比較したフィールドの重要性を示します。 重みはインデックス フィールドの一部またはすべてに指定できます。 スコアを調整するには、「自己管理型配置のテキスト検索結果への重みの割り当て」を参照してください。 デフォルト値は MongoDB 5.0 以降、重みオプションはテキスト インデックスにのみ使用できます。 |
default_language | string | 任意。 テキストインデックスで、ストップワードのリストとステマーとトークナイザのルールを決定する言語。 使用可能な言語については「 自己管理型配置のテキスト検索言語」を、詳細と例については「 自己管理型配置のテキストインデックスのデフォルト言語の指定」を参照してください。 デフォルト値は english です。 |
language_override | string | 任意。 テキストインデックスの場合、ドキュメントの上書き言語を含む、コレクション内のドキュメントのフィールド名です。 デフォルト値は language です。 例については、「 任意のフィールドを使用してドキュメントの言語を指定する」を参照してください。 |
textIndexVersion | integer | 任意。 利用可能なバージョンについては、「バージョン 」を参照してください。 |
インデックスのオプション2dsphere
次のオプションは 2dsphere インデックスのみに使用できます。
Parameter | タイプ | 説明 |
---|---|---|
2dsphereIndexVersion | integer | 任意。 使用可能なバージョンについては、「バージョン 」を参照してください。 |
インデックスのオプション2d
次のオプションは 2d インデックスに対してのみ使用できます。
インデックスのオプションgeoHaystack
次のオプションはgeoHaystackインデックスのみに使用できます。
Parameter | タイプ | 説明 |
---|---|---|
bucketSize | 数値 | geoHaystackインデックスの場合、ロケーション値をグループ化するユニットの数を指定します。つまり、指定されたユニット数内のロケーション値を相互に同じバケット内でグループ化します。 値は 0 より大きくなければなりません。 |
注意
MongoDB 5.0 で削除
MongoDB 5.0 では、非推奨のgeoHaystackインデックスとgeoSearch
コマンドが排除されます。 代わりに、 またはサポートされている$geoNear
地理空間クエリ演算子 のいずれかを使用した 2 d インデックス を使用してください。
MongoDB インスタンスを 5.0 にアップグレードし、featureCompatibilityVersion を 5.0
に設定すると、既存の geoHaystack インデックスがすべて削除されます。
インデックスのオプションwildcard
次のオプションはワイルドカード インデックスでのみ使用できます。
Parameter | タイプ | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
wildcardProjection | ドキュメント | 任意。 特定のフィールドパスをワイルドカード インデックスに含めたり、 ワイルドカード インデックス から除外したりできます。 このオプションは、ワイルドカード インデックスを作成する場合にのみ有効です。
ワイルドカード インデックスでは、デフォルトで
|
動作
同時実行性
バージョン 4.2 で変更。
MongoDB は、インデックス構築の開始時と終了時に、指定されたコレクションを取得して保持する最適化されたビルドプロセスを使用します。 コレクションに対する後続のすべての操作は、 createIndexes()
が排他ロックを解放するまで待機する必要があります。 createIndexes()
では、インデックス構築の大部分の期間中に読み取り操作と書込み操作をインターリーブすることができます。
createIndexes()
のロック動作の詳細については、「 格納済みコレクションでのインデックス ビルド 」を参照してください。
既存インデックスの再作成
すでに存在するインデックスに対してdb.collection.createIndexes()
を呼び出す場合、MongoDB は既存のインデックスを再度作成しません。
インデックス オプション
照合非対応および非表示オプション
照合オプションは除き、1 つのインデックスオプションセットを使用してインデックスを作成し、その後別のインデックスオプションを使用して同じインデックスを再作成しようとすると、MongoDB はオプションを変更せず、インデックスを再作成しません。
非表示オプションはインデックスを削除して再度作成することなく変更できます。詳細は、「非表示オプション」を参照してください。
その他のインデックス オプションを変更するには、新しいオプションで を実行する前に、db.collection.dropIndex()
db.collection.createIndexes()
で既存のインデックスを削除します。
照合オプション
同じキーに対して、異なる照合を持つ複数のインデックスを作成できます。同じキー パターンで照合が異なるインデックスを作成するには、ユニークインデックス名を設定する必要があります。
非表示オプション
注意
インデックスを非表示にするには、 featureCompatibilityVersionを4.4
以上に設定する必要があります。 ただし、非表示にすると、MongoDB 4.4 バイナリでfeatureCompatibilityVersionが4.2
に設定されていても、インデックスは非表示のままになります。
既存のインデックスを非表示または再表示するには、次のmongosh
メソッドを使用できます。
たとえば、
インデックスの
hidden
オプションをtrue
に変更するには、db.collection.hideIndex()
メソッドを使用します。db.restaurants.hideIndex( { borough: 1, ratings: 1 } ); インデックスの
hidden
オプションをfalse
に変更するには、db.collection.unhideIndex()
メソッドを使用します。db.restaurants.unhideIndex( { borough: 1, city: 1 } );
ワイルドカード インデックス
バージョン 4.2の新機能
ワイルドカード インデックスでは、デフォルトで
_id
フィールドが省略されます。_id
フィールドをワイルドカード インデックスに含めるには、wildcardProjection
ドキュメントに明示的に含める必要があります。{ "wildcardProjection" : { "_id" : 1, "<field>" : 0|1 } } _id
フィールドを明示的に含める場合を除き、wildcardProjection
ドキュメントに含むステートメントと除外するステートメントを組み合わせることはできません。ワイルドカード インデックスを作成するには、
mongod
featureCompatibilityVersionが4.2
である必要があります。 fCV を設定する手順については、「 MongoDB 5.0 配置で機能の互換性バージョンを設定する 」を参照してください。ワイルドカード インデックスは、次のインデックス タイプまたはプロパティをサポートしていません。
注意
ワイルドカード インデックスは、ワイルドカード テキスト インデックスとは区別され、互換性もありません。ワイルドカード インデックスは
$text
演算子を使用するクエリをサポートしていません。ワイルドカード インデックスの制限に関する詳細なドキュメントについては、「ワイルドカード インデックスの制限 」を参照してください。
ワイルドカード インデックスの作成例については、「ワイルドカード インデックスの作成 」を参照してください。 ワイルドカード インデックスの詳細なドキュメントについては、「ワイルドカード インデックス 」を参照してください。
トランザクション
トランザクションがクロスシャード間書込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。
トランザクションで db.collection.createIndexes()
を使用するには、そのトランザクションで読み取り保証(read concern)"local"
を使用する必要があります。読み取り保証レベルを "local"
以外に指定すると、トランザクションは失敗します。
例
オプションなしのインデックスの作成
次のようなドキュメントを含む restaurants
コレクションを考えてみましょう。
{ location: { type: "Point", coordinates: [-73.856077, 40.848447] }, name: "Morris Park Bake Shop", cuisine: "Cafe", borough: "Bronx", }
次の例では、restaurants
コレクションに 2 つのインデックスを作成します。 1 つは borough
フィールドの昇順インデックスで、もう 1 つは location
フィールドの 2dsphere インデックスです。
db.restaurants.createIndexes([{"borough": 1}, {"location": "2dsphere"}])
照合が指定されたインデックスの作成
次の例では、products
コレクションに 2 つのインデックスを作成します。1 つは manufacturer
フィールドの昇順インデックスで、もう 1 つは category
フィールドの昇順インデックスです。どちらのインデックスも、ロケール fr
と比較強度 2
を指定する照合を使用します。
db.products.createIndexes( [ { "manufacturer": 1}, { "category": 1 } ], { collation: { locale: "fr", strength: 2 } })
同じ照合ルールを使用するインデックス付きキーに対するクエリまたはソート操作では、MongoDB はインデックスを使用できます。詳細については、「照合とインデックスの使用」を参照してください。
ワイルドカード インデックスの作成
バージョン 4.2 の新機能: ワイルドカード インデックスを作成するには、 mongod
featureCompatibilityVersionが4.2
である必要があります。 fCV を設定する手順については、「 MongoDB 5.0 配置で機能の互換性バージョンを設定する 」を参照してください。
ワイルドカード インデックスの詳細については、「ワイルドカード インデックス」を参照してください。
次に、ワイルドカード インデックスの作成例を示します。
単一フィールドパスでのワイルドカード インデックスの作成
ドキュメントに product_attributes
フィールドが含まれる可能性があるコレクション products_catalog
を考えてみましょう。product_attributes
フィールドには、埋め込みドキュメントや配列など、任意のネストされたフィールドを含めることができます。
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
次の操作を実行すると、product_attributes
フィールドでワイルドカード インデックスが作成されます。
use inventory db.products_catalog.createIndexes( [ { "product_attributes.$**" : 1 } ] )
このワイルドカード インデックスを使用すると、MongoDB はproduct_attributes
のすべてのスカラー値をインデックス化します。フィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
ワイルドカード インデックスは、product_attributes
またはそのネストされたフィールドに対する任意の単一フィールド クエリをサポート可能です。
db.products_catalog.find( { "product_attributes.superFlight" : true } ) db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt : 20 } } ) db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )
注意
パス固有のワイルドカード インデックス構文はwildcardProjection
オプションと互換性がありません。 詳細については、パラメーターのドキュメントを参照してください。
すべてのフィールドパスでのワイルドカード インデックスの作成
ドキュメントに product_attributes
フィールドが含まれる可能性があるコレクション products_catalog
を考えてみましょう。product_attributes
フィールドには、埋め込みドキュメントや配列など、任意のネストされたフィールドを含めることができます。
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
次の操作を実行すると、すべてのスカラー フィールド(_id
フィールドを除く)にワイルドカード インデックスが作成されます。
use inventory db.products_catalog.createIndexes( [ { "$**" : 1 } ] )
このワイルドカード インデックスを使用すると、MongoDB はコレクション内の各ドキュメントのすべてのスカラー フィールドにインデックスを作成します。特定のフィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
作成されたインデックスは、コレクションのドキュメント内の任意のフィールドに対するクエリをサポートできます。
db.products_catalog.find( { "product_price" : { $lt : 25 } } ) db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )
注意
ワイルドカード インデックスでは、デフォルトで _id
フィールドが省略されます。_id
フィールドをワイルドカード インデックスに含めるには、wildcardProjection
ドキュメントに明示的に含める必要があります。詳細については、パラメーターのドキュメントを参照してください。
複数の特定フィールドパスに対するワイルドカード インデックスの作成
ドキュメントに product_attributes
フィールドが含まれる可能性があるコレクション products_catalog
を考えてみましょう。product_attributes
フィールドには、埋め込みドキュメントや配列など、任意のネストされたフィールドを含めることができます。
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
次の操作ではワイルドカード インデックスを作成し、wildcardProjection
オプションを使用して product_attributes.elements
および product_attributes.resistance
フィールドのスカラー値のみをインデックスに含めます。
use inventory db.products_catalog.createIndexes( [ { "$**" : 1 } ], { "wildcardProjection" : { "product_attributes.elements" : 1, "product_attributes.resistance" : 1 } } )
キー パターン"$**"
はドキュメント内のすべてのフィールドをカバーしますが、 wildcardProjection
フィールドは 含まれるフィールドのみにインデックスを制限します。 wildcardProjection
の完全なドキュメントについては、 wildcard
インデックスのオプション を参照してください。
フィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
作成されたインデックスは、 wildcardProjection
に含まれる任意のスカラー フィールドに対するクエリをサポートできます。
db.products_catalog.find( { "product_attributes.elements" : { $eq: "Water" } } ) db.products_catalog.find( { "product_attributes.resistance" : "Bludgeoning" } )
注意
ワイルドカード インデックスは、_id
フィールドを明示的に含める場合を除き、wildcardProjection
ドキュメントに包含・除外ステートメントを混在させることはできません。wildcardProjection
の詳細については、パラメーターのドキュメントを参照してください。
複数の特定フィールドパスを除外するワイルドカード インデックスの作成
ドキュメントに product_attributes
フィールドが含まれる可能性があるコレクション products_catalog
を考えてみましょう。product_attributes
フィールドには、埋め込みドキュメントや配列など、任意のネストされたフィールドを含めることができます。
db.products_catalog.insertMany( [ { _id : ObjectId("5c1d358bf383fbee028aea0b"), product_name: "Blaster Gauntlet", product_attributes: { price: { cost: 299.99, currency: "USD" } } }, { _id: ObjectId("5c1d358bf383fbee028aea0c"), product_name: "Super Suit", product_attributes: { superFlight: true, resistance: [ "Bludgeoning", "Piercing", "Slashing" ] } } ] )
次の操作を実行すると、ワイルドカード インデックスが作成され、wildcardProjection
ドキュメントを使用してコレクション内の各ドキュメントのすべてのスカラー フィールド フィールドとproduct_attributes.elements
product_attributes.resistance
フィールド を除く )がインデックス化されます。
use inventory db.products_catalog.createIndexes( [ { "$**" : 1 } ], { "wildcardProjection" : { "product_attributes.elements" : 0, "product_attributes.resistance" : 0 } } )
キー パターン"$**"
はドキュメント内のすべてのフィールドをカバーしますが、 wildcardProjection
フィールドは指定されたフィールドをインデックスから除外します。 wildcardProjection
の完全なドキュメントについては、 wildcard
インデックスのオプション を参照してください。
フィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
作成されたインデックスは、 wildcardProjection
によって除外されるものを 除くすべてのスカラー フィールドに対するクエリをサポートできます。
db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt: 25 } } ) db.products_catalog.find( { "product_attributes.superStrength" : true } )
注意
ワイルドカード インデックスは、_id
フィールドを明示的に含める場合を除き、wildcardProjection
ドキュメントに包含・除外ステートメントを混在させることはできません。wildcardProjection
の詳細については、パラメーターのドキュメントを参照してください。
コミットクォーラムを使用したインデックスの作成
注意
FeatureCompatibilityVersion 4.4 以上が必要です。
レプリカセット全体でインデックス構築を同時に開始するには、レプリカセットまたはシャーディングされたクラスター内の各 mongod
は、featureCompatibilityVersion を少なくとも 4.4
に設定する必要があります。
レプリカセットまたはシャーディングされたクラスター上のインデックスは、データを保持するすべてのレプリカセット ノードで同時に構築されます。シャーディングされたクラスターの場合、インデックス構築は、インデックスが作成されるコレクションのデータを含むシャードでのみ行われます。プライマリは、インデックスを使用可能とマークする前に、自身を含む最小限のデータを保持する voting
ノード(コミットクォーラム)でインデックス構築を完了する必要があります。詳細については、「レプリケートされた環境でのインデックス構築」を参照してください。
操作に commitQuorum パラメータを指定して、データを保持する投票ノードの最小数(コミットクォーラム)を設定します。プライマリはインデックスを準備完了とマークする前に、インデックス ビルドを完了する必要があります。createIndexes()
デフォルトのコミットクォーラムはvotingMembers
、またはすべてのデータを持つ投票レプリカセット メンバーです。
次の操作では、コミットクォーラムが"majority"
のインデックスが作成されます。
db.getSiblingDB("examples").invoices.createIndexes( { "invoices" : 1 }, { }, "majority" )
プライマリがインデックス構築を準備完了とマークするには、データを保持する単純過半数の投票ノードがインデックス構築をコミットするために「投票」済みである必要があります。インデックス構築と投票プロセスの詳細については、「レプリケートされた環境でのインデックス構築」を参照してください。
複数のインデックスの作成
カリフォルニア州(CA
)とワシントン州(WA
)のケーキ販売を含む cakeSales
コレクションを作成します。
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
次の例では、cakeSales
コレクションに複数のインデックスを作成します。
db.cakeSales.createIndexes( [ { "type": 1 }, { "orderDate": 1 }, { "state": 1 }, { "orderDate": 1, "state": -1 } ] )
最初の 3 つのインデックスは単一のフィールドにあり、昇順(1
)です。
最後のインデックスは、orderDate
では昇順(1
)で、state
では降順(-1
)です。
詳細情報
インデックスに関する追加情報については、以下を参照してください。
MongoDB のインデックスとインデックス作成の詳細については、このマニュアルの インデックス セクションを参照してください。
db.collection.getIndexes()
ではコレクションの既存インデックスの仕様を参照できます。text
インデックスの作成の詳細については、「 自己管理型配置のテキスト インデックス 」を参照してください。地理空間クエリ用の 地理空間インデックス。
データの有効期限を示す TTL インデックス。