Docs Menu
Docs Home
/ /

MongoDB Search でのビューの使用

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 とドライバー メソッド、db.collection.createSearchIndex()db.collection.updateSearchIndex()db.collection.dropSearchIndex()$listSearchIndexes を使用します。

    • ビューに対してMongoDB Search クエリを実行します。

ビューを編集するには、ユーザー管理者ロールを持ち、collMod データベース コマンドを使用する必要があります。

ビューを作成するには、createCollection の権限を持つロールが必要です。

次の例は、ビューを作成し、ドキュメントを部分インデックスし、そのインデックスを使用してビューに対してクエリを実行する方法を示しています。

次の例では、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') ] }
}
}
]

非常に複雑なビュー変換では、Atlas がビューを読み取ってソースコレクションをフィルタリングおよび変換する際にパフォーマンスが低下する可能性があります。このシナリオでは、Atlas で追加のレプリケーション負荷を回避するために、マテリアライズドビュー の作成を検討してください。ビュー変換によって発生するクエリレイテンシを回避するには、ソースコレクションに対して直接クエリを実行して元のドキュメントを取得します。

インデックスは次のシナリオで FAILED ステータスに変更されます。

  • MongoDB Search と互換性のないビューにインデックスを作成する。

  • MongoDB Search の互換性要件を満たさない方法でビューを編集する。

  • ビューのソース コレクションを削除または変更します。

    たとえば、1 つのビューが別のビュー上に作成され、親ビューのソースを別のコレクションに変更した場合です。

    注意

    この制限は、ビューが他のビューの子である場合にも適用されます。たとえば、すべての子が由来するソース コレクションを変更または削除することはできません。

インデックスは次のシナリオで STALE ステータスに変更されます。

警告

ビューで定義された集計パイプラインがコレクション内のドキュメントと互換性がない場合、検索レプリケーションは失敗します。たとえば、$toDouble 式が配列を含むドキュメント フィールドに対して操作されると、レプリケーションは失敗します。ビューがコレクション内のすべてのドキュメントでエラーなく動作することを確認してください。

  • インデックスが READY のときにビュー定義によって集計が失敗した場合、インデックスはSTALE になります。ドキュメントを解決するかビュー定義を変更して失敗しないようにすると、インデックスはREADY に戻ります。STALE の場合でも、インデックスは引き続きクエリ可能です。インデックスがoplogから削除されると、インデックスの再構築がトリガーされます。

  • インデックスが BUILDING の時にビュー定義によって集計パイプラインに障害が発生した場合、インデックス構築はそのドキュメントが修正されるまで停止します。ドキュメントを解決するか、ビュー定義を変更すると、インデックスは READY に戻り、失敗しなくなります。

Atlas UI で「インデックス ステータスの詳細」ページを表示して、インデックス ステータスを確認できます。

このエラーは、8.1 より前のバージョンのMongoDBを使用してビューをクエリすると表示されます。

  • 8.0 より前のバージョンのMongoDBを使用している場合は、ビューを直接クエリするために 8.1+ にアップグレードすることをお勧めします。ソースコレクションをクエリするには、 8.0 にアップグレードします。

  • MongoDB 8.0 を使用する場合は、 ソースコレクションに対してビューインデックスをクエリする必要があります。例、ビューではなくコレクションで .aggregate() を実行します。

ビューでMongoDB Searchインデックスを作成すると、mongot プロセスは通常のコレクションでMongoDB Searchインデックスを作成する場合と同じタスクを実行します。mongot プロセス:

  1. コレクションのインデックス定義 のルールに基づいてMongoDB Search インデックスを作成します。

  2. MongoDB Search インデックスを定義したコレクションについて、ドキュメントとインデックスの現在の状態に関する 変更ストリーム をモニターします。

  3. MongoDB Search クエリを処理し、一致するドキュメントのドキュメントID とその他の検索メタデータを mongod に返します。その後、ドキュメント全体が検索され、その結果がクライアントに返されます。

ビューでMongoDB検索インデックスを作成すると、ステップ 1 と 2 中にビュー定義が適用され、変換されたドキュメントは検索インデックス定義に基づいてインデックス化され、ディスクに保存されます。

ビューの詳細については、「ビュー」を参照してください。

ビューにMongoDB ベクトル検索インデックスを作成するには、「 MongoDB ベクトル検索でビューを使用する 」を参照してください。

戻る

複数のコレクション