ビューに Atlas Search インデックスを作成することで、ドキュメントやコレクションを変換し、コレクションの部分的なインデックス化、互換性のないデータ型やデータモデルのサポートなどを可能にします。
以下の例では、sample_mflix および sample_airbnb サンプル データベースを使用します。
注意
曖昧さ回避
このページでは標準ビューについて説明します。オンデマンドのマテリアライズドビューの詳細については、「オンデマンドのマテリアライズドビュー」を参照してください。
ビュー タイプの違いについては「オンデマンドのマテリアライズドビューとの比較」を参照してください。
要件
MongoDB 8.0 以降を使用する必要があります。
MongoDB v8.0以降の場合:
Atlas UI または Atlas Administration API を使用して、ビューに Atlas Search インデックスを作成します。
ソース コレクションに対して Atlas 検索クエリを実行します。ビューで作成された Atlas Search インデックスを参照してください。これらのクエリは、ソースコレクションにある元のドキュメントをそのまま返します。
MongoDB v8.1 以降の場合、さらに以下のことが可能です。
mongoshおよびドライバーメソッド、db.collection.createSearchIndex()、db.collection.updateSearchIndex()、db.collection.dropSearchIndex()、および$listSearchIndexesを使用して、ビュー上の Atlas 検索インデックスを作成および管理します。ビューに対して Atlas Search クエリを実行します。
制限
Atlas Search は、以下のステージで
$exprのビューのみをサポートしています。インデックス名は、ソース コレクションとそのすべてのビューにわたって一意である必要があります。
Atlas Search は、ビュー定義において、$$USER_ROLES システム変数や $rand 集計演算子など、動的な結果を生成する演算子を使用することをサポートしていません。
Atlas Search クエリは、ソースコレクションにある元のドキュメントをそのまま返します。
例: ドキュメントのフィルタリング
ビューを作成するには、createCollection の権限が必要です。
コレクションを部分的にインデックスして、ドキュメントをフィルタリングすることができます。次の例では、sample_mflix.movies コレクションにビューを作成し、2000 年 1 月 1 日以降に公開された映画のみを検索できるようにします。
mongosh を使用して Atlas クラスターに接続します。
詳しくは、「 mongosh経由で接続 」を参照してください。
Atlas Atlasで、プロジェクトの {0 ページにGoします。GoClusters
警告: ナビゲーションの改善中 現在、新しく改良されたナビゲーション エクスペリエンスを導入中です。次の手順が Atlas UI の表示と一致しない場合は、「プレビュー ドキュメント」を参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
インデックスの設定を開始します。
ページで次の選択を行い、Next をクリックしてください。
Search Type | Atlas Search のインデックスタイプを選択します。 |
Index Name and Data Source | 以下の情報を指定してください。
|
Configuration Method | For a guided experience, select Visual Editor. To edit the raw index definition, select JSON Editor. |
注意
Atlas Search インデックスのデフォルト名は「default」です。この名前を変更しない場合、Atlas Search クエリのデフォルトの検索インデックスが使用され、その演算子では別の index オプションは指定されません。複数のインデックスを作成する場合は、インデックス全体で一貫性があり、内容がわかる命名規則を維持することをお勧めします。
releasedAfter2000Index 部分インデックスにクエリを実行します。
注意
次の例では、releasedAfter2000Index インデックスに対して .aggregate コマンドを実行し、movies_ReleasedAfter2000 という名前のビューを検索します。クラスターが MongoDB v8.0 を実行している場合、ビューのインデックスを使用して、ソースコレクション(例: movies)をクエリする必要があります。ビューを直接クエリするために、MongoDB v8.1 以降にアップグレードしてください。
use sample_mflix
1 db.db.movies_ReleasedAfter2000.aggregate([ 2 { 3 $search: { 4 index: "releasedAfter2000Index", 5 text: { 6 path: "title", 7 query: "foo" 8 }, 9 sort: { 10 released: 1 11 } 12 } 13 } 14 ])
[ { _id: ObjectId('573a13d2f29313caabd929f8'), plot: "Rising from the ashes of Nirvana, the Foo Fighters became a Grammy-winning sensation on their own. Sixteen years of the band's history comes to life in this documentary, from their demo ...", genres: [ 'Documentary', 'Music' ], runtime: 150, cast: [ 'Shawn Cloninger', 'William Goldsmith', 'Jessy Greene', 'Dave Grohl' ], num_mflix_comments: 0, poster: 'https://m.media-amazon.com/images/M/MV5BMzE4OTczMTgxM15BMl5BanBnXkFtZTcwNTU1NjQxOA@@._V1_SY1000_SX677_AL_.jpg', title: 'Foo Fighters: Back and Forth', fullplot: `Rising from the ashes of Nirvana, the Foo Fighters became a Grammy-winning sensation on their own. Sixteen years of the band's history comes to life in this documentary, from their demo tapes through the creation of their 2011 album, "Wasting Light."`, languages: [ 'English' ], released: ISODate('2011-04-05T00:00:00.000Z'), directors: [ 'James Moll' ], awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' }, lastupdated: '2015-08-19 00:00:25.937000000', year: 2011, imdb: { rating: 8.4, votes: 3745, id: 1853563 }, countries: [ 'USA' ], type: 'movie', tomatoes: { viewer: { rating: 4.4, numReviews: 857, meter: 96 }, dvd: ISODate('2011-08-08T00:00:00.000Z'), website: 'http://us.foofightersfilm.com/', production: 'Cinedigm Digital Cinema', lastUpdated: ISODate('2015-09-12T18:42:01.000Z') } } ]
例: フィールドの追加または変更
次の例では、新しい totalPrice フィールド(price フィールドと cleaningFee フィールドの合計)に基づいて、sample_airbnb.listingsAndReviews コレクションで宿泊施設を検索できます。また、Atlas Search は Decimal128 型をサポートしていないため、値を Double に変換します。
mongosh を使用して Atlas クラスターに接続します。
詳しくは、「 mongosh経由で接続 」を参照してください。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
警告: ナビゲーションの改善中 現在、新しく改良されたナビゲーション エクスペリエンスを導入中です。次の手順が Atlas UI の表示と一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
インデックスの設定を開始します。
ページで次の選択を行い、Next をクリックしてください。
Search Type | Atlas Search のインデックスタイプを選択します。 |
Index Name and Data Source | 以下の情報を指定してください。
|
Configuration Method | For a guided experience, select Visual Editor. To edit the raw index definition, select JSON Editor. |
注意
Atlas Search インデックスのデフォルト名は「default」です。この名前を変更しない場合、Atlas Search クエリのデフォルトの検索インデックスが使用され、その演算子では別の index オプションは指定されません。複数のインデックスを作成する場合は、インデックス全体で一貫性があり、内容がわかる命名規則を維持することをお勧めします。
totalPriceIndex インデックスにクエリを実行します。
注意
次の例では、totalPriceIndex インデックスに対して .aggregate コマンドを実行し、listingsAndReviews_totalPrice という名前のビューを検索します。クラスターが MongoDB v8.0 を実行している場合、ビューのインデックスを使用して、ソースコレクション(例: listingsAndReviews)をクエリする必要があります。ビューを直接クエリするために、MongoDB v8.1 以降にアップグレードしてください。
use sample_airbnb
1 db.listingsAndReviews_totalPrice.aggregate([ 2 { 3 $search: { 4 index: "totalPriceIndex", 5 range: { 6 path: "totalPrice", 7 lte: 300 8 }, 9 returnStoredSource: true 10 } 11 } 12 ])
[ { _id: '10006546', totalPrice: 115 }, { _id: '1001265', totalPrice: 215 }, { _id: '10021707', totalPrice: 40 }, { _id: '1003530', totalPrice: 270 }, { _id: '10038496', totalPrice: 269 }, { _id: '10051164', totalPrice: 250 }, { _id: '10057447', totalPrice: 50 }, { _id: '10057826', totalPrice: 205 }, { _id: '10059244', totalPrice: 43 }, { _id: '10066928', totalPrice: 140 }, { _id: '10082422', totalPrice: 60 }, { _id: '10083468', totalPrice: 40 }, { _id: '10084023', totalPrice: 231 }, { _id: '10091713', totalPrice: 231 }, { _id: '10092679', totalPrice: 58 }, { _id: '10096773', totalPrice: 205 }, { _id: '10112159', totalPrice: 90 }, { _id: '10117617', totalPrice: 55 }, { _id: '10120414', totalPrice: 150 }, { _id: '10133554', totalPrice: 121 } ]
ビューを編集する
次の例では、2000 年より前の映画の movies_ReleasedAfter2000 MongoDB ビューを更新します。
db.runCommand( { collMod: "movies_ReleasedAfter2000", viewOn: "movies", "pipeline": [ { $match: { $expr: { $lt: [ "$released", ISODate("2000-01-01T00") ] } } } ] } )
このコマンドを実行すると、Atlas Search はビュー定義の変更を自動的に検出し、ダウンタイムを発生させることなく再インデックス作成を実行します。
ビューのパイプラインを返します
次の例では、movies_ReleasedAfter2000 ビューのパイプラインを返します。
1 db.getCollectionInfos({ name: "movies_ReleasedAfter2000" })[0].options.pipeline
[ { '$match': { '$expr': { '$gt': [ '$released', ISODate('2000-01-01T00:00:00.000Z') ] } } } ]
パフォーマンスに関する考慮事項
ビューで作成されたインデックスに対して、Atlas Search はクエリ時およびレプリケーション時に、ビュー パイプラインで定義した変換やフィルターを適用します。ビュー パイプラインでの些細な変換やフィルターは通常、パフォーマンスへの影響が無視できる程度ですが、ビュー パイプラインでの複雑な変換や選択性の高いフィルターは、クエリやレプリケーションを大幅に遅くする可能性があります。ドキュメントに大規模な変換を行うか、選択性の高いフィルターを適用する場合は、すでに変換済みまたはフィルター済みのドキュメントを使用してマテリアライズド ビューを作成することをご検討ください。実行されたクエリのレイテンシーを、ビューおよびそのソース コレクションと比較することで、ビューのパフォーマンスを評価できます。
トラブルシューティング
インデックスの変更 FAILED
インデックスは次のシナリオで FAILED ステータスに変更されます。
Atlas Search と互換性のないビューにインデックスを作成します。
Atlas Search の互換性要件を満たさない方法でビューを編集します。
ビューのソース コレクションを削除または変更します。
たとえば、1 つのビューが別のビュー上に作成され、親ビューのソースを別のコレクションに変更した場合です。
注意
この制限は、ビューが他のビューの子である場合にも適用されます。たとえば、すべての子が由来するソース コレクションを変更または削除することはできません。
インデックスの変更 STALE
インデックスは次のシナリオで STALE ステータスに変更されます。
警告
ビューで定義された集計パイプラインがコレクション内のドキュメントと互換性がない場合、検索レプリケーションは失敗します。たとえば、$toDouble 式が配列を含むドキュメント フィールドに対して操作されると、レプリケーションは失敗します。ビューがコレクション内のすべてのドキュメントでエラーなく動作することを確認してください。
READYSTALEREADYインデックスがSTALEのときにビュー定義によって集計が失敗した場合、インデックスは になります。ドキュメントを解決するかビュー定義を変更して失敗しないようにすると、インデックスは に戻ります。 の場合でも、インデックスは引き続きクエリ可能です。インデックスがoplogから削除されると、インデックスの再構築がトリガーされます。インデックスが
BUILDINGの時にビュー定義によって集計パイプラインに障害が発生した場合、インデックス構築はそのドキュメントが修正されるまで停止します。ドキュメントを解決するか、ビュー定義を変更すると、インデックスはREADYに戻り、失敗しなくなります。
Atlas UI で「インデックス ステータスの詳細」ページを表示して、インデックス ステータスを確認できます。
エラー:$search はパイプラインの最初のステージとしてのみ有効です
このエラーは、8.1 より前のバージョンのMongoDBを使用してビューをクエリすると表示されます。
8.0 より前のバージョンのMongoDBを使用している場合は、ビューを直接クエリするために 8.1+ にアップグレードすることをお勧めします。ソースコレクションをクエリするには、 8.0 にアップグレードします。
MongoDB 8.0 を使用する場合は、 ソースコレクションに対してビューインデックスをクエリする必要があります。例、ビューではなくコレクションで
.aggregate()を実行します。
インデックス プロセス
ビューで Atlas Search インデックスを作成すると、mongot プロセスは通常のコレクションで Atlas Search インデックスを作成する場合と同じタスクを実行します。mongotプロセス:
コレクションのインデックス定義のルールに基づいて Atlas Search インデックスを作成します。
Atlas Search インデックスを定義したコレクションについて、ドキュメントとインデックスの現在の状態に関する変更ストリームをモニターします。
Atlas Search クエリを処理し、一致するドキュメントのドキュメント ID とその他の検索メタデータを
mongodに返します。その後、ドキュメント全体が検索され、その結果がクライアントに返されます。
ビューで Atlas Search インデックスを作成すると、ステップ 1 と 2 の間にビュー定義が適用され、変換されたドキュメントはディスク上の Atlas Search インデックスに保存されます。
詳細
ビューの詳細については、「ビュー」を参照してください。
ビューに Atlas ベクトル検索インデックスを作成するには、「 Atlas ベクトル検索でビューを使用する 」を参照してください。