ドキュメントおよびコレクションを変換するために、ビュー上にMongoDB Search インデックスを作成できます。これにより、コレクションの一部のみをインデックス化したり、互換性のないデータ型やデータモデルをサポートしたりすることが可能になります。
The following examples use the sample_mflix and sample_airbnb sample databases.
注意
曖昧さ回避
このページでは標準ビューについて説明します。オンデマンドのマテリアライズドビューの詳細については、「オンデマンドのマテリアライズドビュー」を参照してください。
ビュー タイプの違いについては「オンデマンドのマテリアライズドビューとの比較」を参照してください。
要件
MongoDB 8.0 以降を使用する必要があります。
MongoDB v8.0以降の場合:
Atlas UIまたは Atlas 管理APIを使用して、ビューにMongoDB Search インデックスを作成します。
ソースコレクションに対してMongoDB Search クエリを実行します。ビュー で作成されたMongoDB Searchインデックスを参照します。これらのクエリでは、 ソースコレクションに現れる元のドキュメントが返されます。
MongoDB v8.1 以降の場合、さらに以下のことが可能です。
Use
mongoshand Driver methods,db.collection.createSearchIndex(),db.collection.updateSearchIndex(),db.collection.dropSearchIndex(), and$listSearchIndexesto create and manage MongoDB Search indexes on Views.ビューに対してMongoDB Search クエリを実行します。
MongoDB v8.2 以降の場合、さらに以下のことが可能です。
Use
$rankFusionin aggregation pipelines on Views.Query Views that include sharded sub-pipelines with
$lookupand$unionWith.
To edit a View, you must have a User Admin role and use the collMod database command.
制限
インデックス名は、ソース コレクションとそのすべてのビューにわたって一意である必要があります。
MongoDB Search doesn't support view definitions with operators that produce dynamic results, such as the $$USER_ROLES system variable and the
$randaggregation operator.MongoDB Search クエリでは、 ソースコレクションに現れる元のドキュメントが返されます。
- 変換されたドキュメントを検索するには、
storedSourceオプションを使用してください。
必要な権限
To create a View, your role must have the createCollection privilege.
例
次の例は、ビューの作成、部分インデックスの作成、およびインデックスを使用したクエリの実行方法を示しています。これらの例では、ソースコレクションまたはビューに対して .aggregate コマンドを実行してインデックスをクエリします。MongoDB Search は、MongoDB v8.1 以降でのみビューに対する直接のクエリをサポートしています。
ドキュメントをフィルターして、コレクションに部分的にインデックスを付けることができます。次の例では、sample_mflix.movies コレクションにビューを作成し、2000 年 1 月 1 日以降に公開された映画のみを検索できるようにします。
次の例では、新しい totalPrice フィールド(price フィールドと cleaningFee フィールドの合計)に基づいて、sample_airbnb.listingsAndReviews コレクションで宿泊施設を検索できます。また、MongoDB Search は Decimal128 型をサポートしていないため、値を Double に変換する必要があります。
To index fields matching a naming pattern, use a View to transform your data so that the fields to index are nested in a sub-document. This enables you to use dynamic mappings for the sub-document path so that you can automatically search all new fields with the suffix _type, without any changes to your index definition.
The following View named listings_SearchableTypes only matches field names that end with _type in the sample_airbnb.listingsAndReviews collection. Specifically, the $set stage adds a new field named searchable_types, which contains the filtered fields with the term _type in the field name. The $arrayToObject contains the filter input (entire document) and condition (regex match for _type).
Decimal128 タイプのフィールドで検索するには、値を double タイプに変換することをお勧めします。
以下の例では、sample_airbnb.listingsAndReviews名前空間にビューを作成し、totalPriceという名前のフィールドを追加します。このフィールドには、priceフィールドとcleaning_feeフィールドの値をdoubleに変換した後の合計が含まれます。
ビューを編集する
次の例では、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
[ { '$match': { '$expr': { '$gt': [ '$released', ISODate('2000-01-01T00:00:00.000Z') ] } } } ]
パフォーマンスに関する考慮事項
Highly complex view transformations can increase indexing and query time. This is because the mongod must read the view definition when it filters and transforms the oplog entries during indexing (initial sync and steady state replication), and when it applies those transformations to the returned documents at query-time.
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 中にビュー定義が適用され、変換されたドキュメントは検索インデックス定義に基づいてインデックス化され、ディスクに保存されます。
詳細
ビューの詳細については、「ビュー」を参照してください。
To create a MongoDB Vector Search index on a View, see Use Views with MongoDB Vector Search.