MongoDB とドライバー
このページでは、 mongosh メソッドについて説明します。MongoDB ドライバーで同等のメソッドを確認するには、ご使用のプログラミング言語の対応するページを参照してください。
定義
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
createIndex() メソッドの形式は次のとおりです。
db.collection.createIndex( <keys>, <options>, <commitQuorum> )
パラメーター
createIndex() メソッドは次のパラメーターを取ります。
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | フィールドと値のペアを含むドキュメント。フィールドはインデックス キーで、値はそのフィールドのインデックスのタイプを表します。 フィールドに昇順インデックスを作成する場合、 アスタリスク( MongoDB は、次のような多彩なインデックス タイプをサポートしています。 詳細については、「インデックス タイプ」を参照してください。 ワイルドカード インデックスは、ユーザーがカスタム フィールドまたはコレクション内の多種多様なフィールドに対してクエリを実行するワークロードをサポートします。
|
| ドキュメント | 任意。 インデックスの作成を制御する一連のオプションを含むドキュメント。 詳細については、「 オプション 」を参照してください。 |
整数または文字列 | 任意。データを保持する投票レプリカセット ノードの最小数(コミットクォーラム)で、プライマリが 次の値をサポートします。
|
オプション
options ドキュメントには、インデックスの作成を制御する一連のオプションが含まれています。異なるインデックス タイプには、そのタイプに固有の追加オプションがある場合があります。
同じドキュメント内で複数のインデックスオプションを指定できます。ただし、複数のオプション ドキュメントを指定すると、db.collection.createIndex() 操作は失敗します。
次の db.collection.createIndex() 操作を考えてみましょう。
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 のインデックスは、発音と大文字・小文字の両方を区別しません。
同じキーに対して、異なる照合を持つ複数のインデックスを作成できます。同じキー パターンで照合が異なるインデックスを作成するには、ユニークインデックス名を設定する必要があります。
string の比較にインデックスを使用するには、操作で同じ照合も指定する必要があります。操作でインデックスと異なる照合が指定されている場合、インデックスはインデックス フィールドで string の比較をサポートできません。
警告
照合対応のインデックスキーは、照合のないインデックスのインデックスキーよりも大きくなる可能性があります。これは、照合付きで構成されたインデックスが ICU 照合キーを使用して並べ替え順序を実現するためです。
次のコードを使用して、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" } )
ただし、デフォルトで「シンプル」なバイナリー コレータを使用する次の クエリ操作、インデックスを使用できず、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" と一致しません。
text インデックスのオプション
次のオプションはテキストインデックスのみに使用できます。
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | 任意.テキスト インデックスの場合、フィールドと重みを含むドキュメントが組み合わされます。重みは 1 から 99、999 までの範囲で、スコアに関して他のインデックス フィールドと比較したフィールドの重要性を示します。重みはインデックス フィールドの一部またはすべてに指定できます。「自己管理型配置の $text クエリ結果への重みの割り当て」を参照してください。デフォルト値は MongoDB 5.0 以降、重みオプションはテキスト インデックスにのみ使用できます。 |
| string | 任意.テキスト インデックスで、ストップワードのリストと ステマーとトークナイザのルールを決定する言語。「自己管理型配置の $text クエリ言語」を、詳細と例については「自己管理型MongoDBのテキストインデックスの言語の指定」を参照してください。デフォルト値は |
| string | 任意。テキスト インデックスの場合、ドキュメントの上書き言語を含む、コレクション内のドキュメントのフィールドの名前です。デフォルト値は |
| integer | 任意。 使用可能なバージョンについては、「自己管理型配置のテキストインデックス バージョン 」を参照してください。 |
2dsphere インデックスのオプション
次のオプションは 2dsphere インデックスのみに使用できます。
Parameter | タイプ | 説明 |
|---|---|---|
| integer | 任意。 使用可能なバージョンについては、「2dsphere インデックス」を参照してください。 |
2d インデックスのオプション
次のオプションは 2d インデックスに対してのみ使用できます。
wildcard インデックスのオプション
ワイルドカード インデックスは wildcardProjection オプションを使用できます。
Parameter | タイプ | 説明 | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ドキュメント | 任意。特定のフィールドパスを ワイルドカード インデックス に含めたり除外したりできるようにします。 このオプションは、すべてのドキュメント フィールドにワイルドカード インデックスを作成する場合にのみ有効です。特定のフィールドパスとそのサブフィールドにワイルドカード インデックスを作成する場合には、
ただし、ワイルドカード フィールドと通常の(ワイルドカード以外の)フィールドに同じフィールドを含むインデックスを定義することはできません。 インデックスを正しく定義するには、
ワイルドカード インデックスでは、デフォルトで
|
動作
既存インデックスの再作成
既存インデックス向けに db.collection.createIndex() を呼び出す場合、MongoDB はそのインデックスを再度作成しません。
インデックス オプション
照合非対応および非表示オプション
照合オプションは除き、1 つのインデックスオプションセットを使用してインデックスを作成し、その後別のインデックスオプションを使用して同じインデックスを再作成しようとすると、MongoDB はオプションを変更せず、インデックスを再作成しません。
非表示オプションはインデックスを削除して再度作成することなく変更できます。詳細は、「非表示オプション」を参照してください。
その他のインデックス オプションを変更するには、新しいオプションで を実行する前に、db.collection.dropIndex() db.collection.createIndex()で既存のインデックスを削除します。
照合オプション
同じキーに対して、異なる照合を持つ複数のインデックスを作成できます。同じキー パターンで照合が異なるインデックスを作成するには、ユニークインデックス名を設定する必要があります。
非表示オプション
既存のインデックスを非表示または再表示するには、次のmongoshメソッドを使用できます。
たとえば、
インデックスの
hiddenオプションをtrueに変更するには、db.collection.hideIndex()メソッドを使用します。db.movies.hideIndex( { title: 1 } ) インデックスの
hiddenオプションをfalseに変更するには、db.collection.unhideIndex()メソッドを使用します。db.movies.unhideIndex( { title: 1 } )
トランザクション
トランザクションがクロスシャード間書込みトランザクション(write transaction)でない場合に、分散トランザクション内にコレクションとインデックスを作成できます。
トランザクションで db.collection.createIndex() を使用するには、そのトランザクションで読み取り保証(read concern)"local" を使用する必要があります。読み取り保証レベルを "local" 以外に指定すると、トランザクションは失敗します。
インデックス構築
バージョン 7.1 で変更。
MongoDB 7.1 以降では、インデックス構築でのエラー報告が高速化され、障害回復力が高まります。 新しいindexBuildMinAvailableDiskSpaceMBパラメータを使用して、インデックスビルドに必要な最小ディスク容量を設定することもできます。これにより、ディスク容量が低すぎる場合はインデックスビルドが停止します。
次の表は、MongoDB 7.1 以降と以前のバージョンのインデックス構築動作を比較したものです。
MongoDB 7.1 以降の 動作 | 以前の MongoDB バージョンでの動作 |
|---|---|
重複キー エラーを除く、コレクションスキャンフェーズ中に見つかったインデックス エラーは直ちに返され、その後インデックスのビルドは停止します。 以前の MongoDB バージョンでは、インデックスビルドの終了間際に発生するコミットフェーズでエラーが返されます。 MongoDB 7.1 は、インデックス エラーを迅速に診断するのに役立ちます。 たとえば、互換性のないインデックス値の形式が見つかった場合は、すぐにエラーが返されます。 | MongoDB 7.1 と比較して、インデックス構築エラーが返されるまでに長い時間がかかる可能性があります。このエラーはコミットフェーズのインデックス構築の終了間して返されるためです。 |
インデックス構築エラーにより、セカンダリ ノードがクラッシュする可能性があります。 | |
インデックス ビルドのためのディスク領域の管理を改善しました。 使用可能なディスク容量が | 使用可能なディスク容量が不足しても、インデックスの構築は停止しません。 |
例
このページの例では、付属の sample_mflixサンプルデータセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「サンプルデータセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
注意
moviesコレクション内のドキュメントには、ここに表示されていない追加フィールドが含まれています。
単一フィールドでの昇順インデックスの作成
次の例では、フィールド title に昇順のインデックスを作成しています。
db.movies.createIndex( { title: 1 } )
keys ドキュメントで複数のフィールドが指定されている場合、createIndex() で複合インデックスが作成されます。
複数のフィールドでのインデックスの作成
次の例では、year、runtime、title フィールドに複合インデックスを作成しています。
db.movies.createIndex( { year: 1, runtime: 1, title: 1 } )
複合インデックスには、単一のハッシュされたフィールドを含めることができます。複合ハッシュインデックスでは、FeatureCompatibilityVersion を少なくとも 5.0 に設定する必要があります。
次の例では、title フィールド(昇順)と runtime フィールド(ハッシュ)に複合インデックスを作成します。
db.movies.createIndex( { title: 1, runtime: "hashed" } )
複合インデックス内のフィールドの順序は、インデックスを使用する sort() 操作をサポートするうえで重要です。
照合が指定されたインデックスの作成
次の例では、movies コレクションにtitle_fr という名前のインデックスを作成します。この例では、ロケール frと比較強度 を指定する照合を使用してインデックスを作成します。2
db.movies.createIndex( { title: 1 }, { name: "title_fr", collation: { locale: "fr", strength: 2 } } )
次の例では、照合を伴う title_category_fr という名前の複合インデックスを作成します。照合は文字列値を持つインデックス キーのみに適用されます。
db.movies.createIndex( { title: 1, year: 1 }, { name: "title_year_fr", collation: { locale: "fr", strength: 2 } } )
照合は、値が文字列であるインデックス キーに適用されます。
同じ照合ルールを使用するインデックス付きキーに対するクエリまたはソート操作では、 MongoDB はインデックスを使用できます。インデックスは strength: 2 の照合を使用するため、インデックスを使用すると大文字と小文字が区別されないクエリが発生します。詳細については、照合とインデックスの使用を参照してください。
ワイルドカード インデックスの作成
ワイルドカード インデックスでは、デフォルトで
_idフィールドが省略されます。_idフィールドをワイルドカード インデックスに含めるには、wildcardProjectionドキュメントに明示的に含める必要があります。{ "wildcardProjection": { "_id": 1, "<field>": 0|1 } } wildcardProjectionドキュメント内のすべてのステートメントは、包含ステートメントまたは除外ステートメントのいずれかである必要があります。除外ステートメントに_idフィールドを含めることもできます。これは、このルールの唯一の例外です。ワイルドカード インデックスは次のインデックスをサポートしていません。
ワイルドカード インデックスはスパースインデックスです。インデックス付きフィールドがない場合は、クエリをサポートしません。ワイルドカード フィールドに
null値がある場合、ワイルドカード インデックスはドキュメントにインデックスを作成します。MongoDB 7.0 以降、ワイルドカード インデックスで昇順(
1)と降順(-1)のソート順序がサポートされます。以前のバージョンでは、昇順のみがサポートされていました。
詳しくは以下を参照してください。
例については、以下を参照してください。
単一フィールドパスでのワイルドカード インデックスの作成
次の操作を実行すると、awards フィールドでワイルドカード インデックスが作成されます。
db.movies.createIndex( { "awards.$**": 1 } )
このワイルドカードを使用すると、 MongoDB はawards のすべてのスカラー値をインデックス化します。フィールドがネストされたドキュメントまたは配列の場合、ワイルドカードはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
ワイルドカード インデックスは、awards またはそのネストされたフィールドに対する任意の単一フィールド クエリをサポート可能です。
db.movies.find( { "awards.wins": { $gt: 1 } }, { title: 1 } )
db.movies.find( { "awards.nominations": { $gt: 5 } }, { title: 1 } )
注意
パス固有のワイルドカード インデックス構文はwildcardProjectionオプションと互換性がありません。 詳細については、パラメーターのドキュメントを参照してください。
すべてのフィールドパスでのワイルドカード インデックスの作成
次の操作を実行すると、すべてのスカラー フィールド(_id フィールドを除く)にワイルドカード インデックスが作成されます。
db.movies.createIndex( { "$**": 1 } )
このワイルドカード を使用すると、 MongoDB はコレクション内の核ドキュメントのすべてのスカラー フィールドにインデックスを作成します。特定のフィールドがネストされたドキュメントまたは配列の場合、ワイルドカードはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
作成されたインデックスは、コレクションのドキュメント内の任意のフィールドに対するクエリをサポートできます。
db.movies.find( { runtime: { $gt: 300 } }, { title: 1 } )
db.movies.find( { "awards.nominations": { $gt: 5 } }, { title: 1 } )
注意
ワイルドカード インデックスでは、デフォルトで _id フィールドが省略されます。_id フィールドをワイルドカード インデックスに含めるには、wildcardProjection ドキュメントに明示的に含める必要があります。詳細については、パラメーターのドキュメントを参照してください。
ワイルドカード インデックス カバレッジへの特定フィールドの含有
次の操作ではワイルドカード インデックスを作成し、wildcardProjection オプションを使用して tomatoes.viewer および tomatoes.critic フィールドのスカラー値のみをインデックスに含めます。
db.movies.createIndex( { "$**": 1 }, { "wildcardProjection": { "tomatoes.viewer": 1, "tomatoes.critic": 1 } } )
パターン "$**" にはドキュメント内のすべてのフィールドが含まれます。指定したフィールドでインデックスを制限するには、wildcardProjection フィールドを使用します。wildcardProjection の完全なドキュメントについては、「wildcard インデックスのオプション」を参照してください。
フィールドがネストされたドキュメントまたは配列の場合、ワイルドカード インデックスはそのフィールドを再帰処理して、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
ワイルドカード インデックスは、wildcardProjection に含まれる任意のスカラーフィールドに対するクエリをサポートします。
db.movies.find( { "tomatoes.viewer.rating": { $gt: 4 } }, { title: 1 } )
注意
ワイルドカード インデックスは、_id フィールドを明示的に含める場合を除き、wildcardProjection ドキュメントに包含・除外ステートメントを混在させることはできません。wildcardProjection の詳細については、パラメーターのドキュメントを参照してください。
ワイルドカード インデックス カバレッジからの特定フィールドの除外
この例では、ワイルドカード インデックスと wildcardProjection ドキュメントを使用して、コレクション内の各ドキュメントのスカラー フィールドにインデックスを作成します。
ワイルドカード インデックスでは、tomatoes.viewer フィールドと tomatoes.critic フィールドは除外されます。
db.movies.createIndex( { "$**": 1 }, { "wildcardProjection": { "tomatoes.viewer": 0, "tomatoes.critic": 0 } } )
ワイルドカード パターン "$**" にはドキュメント内のすべてのフィールドが含まれます。ただし、wildcardProjection フィールドは指定されたフィールドをインデックスから除外します。
wildcardProjection の完全なドキュメントについては、「wildcard インデックスのオプション」を参照してください。
フィールドがネストされたドキュメントまたは配列の場合、ワイルドカードはドキュメントまたは配列に再帰し、ドキュメントまたは配列内のすべてのスカラー フィールドにインデックスを作成します。
インデックスは、wildcardProjection によって除外されるものを除くすべてのスカラー フィールドに対するクエリをサポートできます。
db.movies.find( { "tomatoes.viewer.rating": { $gt: 3 } }, { title: 1 } )
注意
ワイルドカード インデックスは、_id フィールドを明示的に含める場合を除き、wildcardProjection ドキュメントに包含・除外ステートメントを混在させることはできません。wildcardProjection の詳細については、パラメーターのドキュメントを参照してください。
コミットクォーラムを使用したインデックスの作成
注意
FeatureCompatibilityVersion 4.4 以上が必要です。
レプリカセット全体でインデックス構築を同時に開始するには、レプリカセットまたはシャーディングされたクラスター内の各 mongod は、featureCompatibilityVersion を少なくとも 4.4 に設定する必要があります。
レプリカセットまたはシャーディングされたクラスター上のインデックスは、データを保持するすべてのレプリカセット ノードで同時に構築されます。シャーディングされたクラスターの場合、インデックス構築は、インデックスが作成されるコレクションのデータを含むシャードでのみ行われます。プライマリは、インデックスを使用可能とマークする前に、自身を含む最小限のデータを保持する voting ノード(コミットクォーラム)でインデックス構築を完了する必要があります。詳細については、「レプリケートされた環境でのインデックス構築」を参照してください。
コミットクォーラムを設定するには、createIndex() を使用して commitQuorum 値を指定します。
commitQuorum は、データを保持する投票ノードの数、またはプライマリがコミットを実行する前にプライマリを含めてどの投票ノードがインデックス構築のコミット準備をしておく必要があるかを指定します。コミットクォーラムのデフォルトである votingMembers は、データを保持するすべてのノードを指します。
次の操作を実行すると、コミットクォーラム が "majority" であるか、データを保持する投票ノードの単純過半数であるインデックスが作成されます。
db.movies.createIndex( { "title": 1 }, { }, "majority" )
プライマリがインデックス構築を準備完了とマークするには、データを保持する単純過半数の投票ノードがインデックス構築をコミットするために「投票」済みである必要があります。インデックス構築と投票プロセスの詳細については、「レプリケートされた環境でのインデックス構築」を参照してください。
詳細情報
MongoDB のインデックスとインデックス作成の詳細については、このマニュアルの インデックス セクションを参照してください。
db.collection.getIndexes()ではコレクションの既存インデックスの仕様を参照できます。textインデックスの作成の詳細については、「 自己管理型配置のテキスト インデックス 」を参照してください。地理空間クエリ用の 地理空間インデックス。
データの有効期限を示す TTL インデックス。