ドキュメントおよびコレクションを変換するために、ビュー上にMongoDB Search インデックスを作成できます。これにより、コレクションの一部のみをインデックス化したり、互換性のないデータ型やデータモデルをサポートしたりすることが可能になります。
以下の例では、sample_mflix および sample_airbnb のサンプルデータベースを使用します。
注意
曖昧さ回避
このページでは標準ビューについて説明します。オンデマンドのマテリアライズドビューの詳細については、「オンデマンドのマテリアライズドビュー」を参照してください。
ビュー タイプの違いについては「オンデマンドのマテリアライズドビューとの比較」を参照してください。
要件
MongoDB 8.0 以降を使用する必要があります。
MongoDB v8.0以降の場合:
Atlas UIまたは Atlas 管理APIを使用して、ビューにMongoDB Search インデックスを作成します。
ソースコレクションに対してMongoDB Search クエリを実行します。ビュー で作成されたMongoDB Searchインデックスを参照します。これらのクエリでは、 ソースコレクションに現れる元のドキュメントが返されます。
MongoDB v8.1 以降の場合、さらに以下のことが可能です。
ビューでMongoDB Search インデックスを作成および管理するには、
mongoshメソッドとドライバー$listSearchIndexesメソッド、db.collection.createSearchIndex()db.collection.dropSearchIndex()、 、db.collection.updateSearchIndex()、 を使用します。ビューに対してMongoDB Search クエリを実行します。
MongoDB v8.2 以降の場合、さらに以下のことが可能です。
ビューの集計パイプラインで
$rankFusionを使用します。$lookupと$unionWithを使用してシャーディングされたサブパイプラインを含むクエリビュー。
制限
インデックス名は、ソース コレクションとそのすべてのビューにわたって一意である必要があります。
MongoDB Searchでは、 $$USER_ROLES システム変数や
$rand集計演算子など、動的な結果を生成する演算子を使用した ビュー定義はサポートされていません。MongoDB Search クエリでは、 ソースコレクションに現れる元のドキュメントが返されます。
- 変換されたドキュメントを検索するには、
storedSourceオプションを使用してください。
必要な権限
ビューを作成するには、createCollection の権限を持つロールが必要です。
例
次の例は、ビューの作成、部分インデックスの作成、およびインデックスを使用したクエリの実行方法を示しています。これらの例では、ソースコレクションまたはビューに対して .aggregate コマンドを実行してインデックスをクエリします。MongoDB Search は、MongoDB v8.1 以降でのみビューに対する直接のクエリをサポートしています。
ビューを編集する
次の例では、2000 年より前の映画の movies_ReleasedAfter2000 MongoDB ビューを更新します。
db.runCommand({ collMod: "movies_ReleasedAfter2000", viewOn: "movies", "pipeline": [ { $match: { $expr: { $lt: [ "$released", ISODate("2000-01-01T00") ] } } } ] })このコマンドを実行すると、MongoDB Search はビュー定義の変更を自動的に検出し、ダウンタイムを発生させることなく再インデックス作成を実行します。
ビューのパイプラインを返します
次の例では、movies_ReleasedAfter2000 ビューのパイプラインを返します。
db.getCollectionInfos({ name: "movies_ReleasedAfter2000" })[0].options.pipelineパフォーマンスに関する考慮事項
非常に複雑なビュー変換では、インデックスの作成とクエリ時間が増加する可能性があります。これは、インデックス作成(最初の同期と 定常状態のレプリケーション)中にoplogエントリをフィルタリングして変換するとき、およびクエリ時に返されたドキュメントにそれらの変換を適用するときに、mongodはビュー定義を読み取る必要があるためです。
Atlas で余計なレプリケーション負荷を回避するために、 マテリアライズドビューの作成を検討してください。ビュー変換によるクエリレイテンシを回避するために、ソースコレクションを直接クエリすることもできます。
トラブルシューティング
インデックスの変更 FAILED
インデックスは次のシナリオで FAILED ステータスに変更されます。
MongoDB Search と互換性のないビューにインデックスを作成する。
MongoDB Search の互換性要件を満たさない方法でビューを編集する。
ビューのソース コレクションを削除または変更します。
たとえば、1 つのビューが別のビュー上に作成され、親ビューのソースを別のコレクションに変更した場合です。
注意
この制限は、ビューが他のビューの子である場合にも適用されます。たとえば、すべての子が由来するソース コレクションを変更または削除することはできません。
インデックスの変更 STALE
インデックスは次のシナリオで STALE ステータスに変更されます。
警告
ビューで定義された集計パイプラインがコレクション内のドキュメントと互換性がない場合、検索レプリケーションは失敗します。たとえば、$toDouble 式が配列を含むドキュメント フィールドに対して操作されると、レプリケーションは失敗します。ビューがコレクション内のすべてのドキュメントでエラーなく動作することを確認してください。
インデックスが
READYのときにビュー定義によって集計が失敗した場合、インデックスはSTALEになります。ドキュメントを解決するかビュー定義を変更して失敗しないようにすると、インデックスはREADYに戻ります。STALEの場合でも、インデックスは引き続きクエリ可能です。インデックスがoplogから削除されると、インデックスの再構築がトリガーされます。インデックスが
BUILDINGの時にビュー定義によって集計パイプラインに障害が発生した場合、インデックス構築はそのドキュメントが修正されるまで停止します。ドキュメントを解決するか、ビュー定義を変更すると、インデックスはREADYに戻り、失敗しなくなります。
Atlas UI で「インデックス ステータスの詳細」ページを表示して、インデックス ステータスを確認できます。
エラー: $search はパイプラインの最初のステージとしてのみ有効です
このエラーは、8.1 より前のバージョンのMongoDBを使用してビューをクエリすると表示されます。
8.0 より前のバージョンのMongoDBを使用している場合は、ビューを直接クエリするために 8.1+ にアップグレードすることをお勧めします。ソースコレクションをクエリするには、 8.0 にアップグレードします。
MongoDB 8.0 を使用する場合は、 ソースコレクションに対してビューインデックスをクエリする必要があります。例、ビューではなくコレクションで
.aggregate()を実行します。
インデックス プロセス
ビューでMongoDB Searchインデックスを作成すると、mongot プロセスは通常のコレクションでMongoDB Searchインデックスを作成する場合と同じタスクを実行します。mongot プロセス:
コレクションのインデックス定義 のルールに基づいてMongoDB Search インデックスを作成します。
MongoDB Search インデックスを定義したコレクションについて、ドキュメントとインデックスの現在の状態に関する 変更ストリーム をモニターします。
MongoDB Search クエリを処理し、一致するドキュメントのドキュメントID とその他の検索メタデータを
mongodに返します。その後、ドキュメント全体が検索され、その結果がクライアントに返されます。
ビューでMongoDB検索インデックスを作成すると、ステップ 1 と 2 中にビュー定義が適用され、変換されたドキュメントは検索インデックス定義に基づいてインデックス化され、ディスクに保存されます。
詳細
ビューの詳細については、「ビュー」を参照してください。
ビューにMongoDB ベクトル検索インデックスを作成するには、 MongoDB ベクトル検索でビューを使用する を参照してください。