ビューで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 は、次のステージを持つビューをサポートしています。
インデックス名は、ソース コレクションとそのすべてのビューにわたって一意である必要があります。
MongoDB Searchでは、 $$USER_ROLES システム変数や $read集計演算子など、動的結果を生成する演算子を使用したビュー定義はサポートされていません。
MongoDB Search クエリでは、 ソースコレクションに現れる元のドキュメントが返されます。
変換されたドキュメントを検索するには、
storedSource
オプションを使用してください。
例: ドキュメントのフィルタリング
ビューを作成するには、createCollection
の権限が必要です。
コレクションを部分的にインデックスして、ドキュメントをフィルタリングすることができます。次の例では、sample_mflix.movies
コレクションにビューを作成し、2000 年 1 月 1 日以降に公開された映画のみを検索できるようにします。
mongosh
を使用してクラスターに接続します。
詳細については、「mongosh経由でクラスターに接続する」を参照してください。
Atlas Atlasで、プロジェクトの {0 ページにGoします。GoClusters
警告: ナビゲーションの改善が進行中次の手順が Atlas UIのビューと一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
インデックスの設定を開始します。
ページで次の選択を行い、Next をクリックしてください。
Search Type | MongoDB Search のインデックスタイプを選択します。 |
Index Name and Data Source | 以下の情報を指定してください。
|
Configuration Method | For a guided experience, select Visual Editor. To edit the raw index definition, select JSON Editor. |
重要:
MongoDB Searchインデックスの名前はデフォルトで default
です。この名前を維持する場合、インデックスは、演算子に別の index
オプションを指定していないMongoDB Search クエリのデフォルトの検索インデックスになります。複数のインデックスを作成する場合は、インデックス間で一貫した記述的な命名規則を維持することをお勧めします。
releasedAfter2000Index
部分インデックスにクエリを実行します。
注意
次の例では、releasedAfter2000Index
インデックスに対して .aggregate
コマンドを実行し、movies_ReleasedAfter2000
という名前のビューを検索します。クラスターが MongoDB v8.0 を実行している場合、ビューのインデックスを使用して、ソースコレクション(例: movies
)をクエリする必要があります。ビューを直接クエリするために、MongoDB v8.1 以降にアップグレードしてください。
use sample_mflix db.movies_ReleasedAfter2000.aggregate([ { $search: { index: "releasedAfter2000Index", text: { path: "title", query: "foo" }, sort: { released: 1 } } } ])
[ { _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') } } ]
MongoDB 配置にmongosh
を使用して接続します。
詳細については、「mongosh経由でクラスターに接続する」を参照してください。
releasedAfter2000Index
部分インデックスにクエリを実行します。
注意
次の例では、releasedAfter2000Index
インデックスに対して .aggregate
コマンドを実行し、movies_ReleasedAfter2000
という名前のビューを検索します。クラスターが MongoDB v8.0 を実行している場合、ビューのインデックスを使用して、ソースコレクション(例: movies
)をクエリする必要があります。ビューを直接クエリするために、MongoDB v8.1 以降にアップグレードしてください。
use sample_mflix db.movies_ReleasedAfter2000.aggregate([ { $search: { index: "releasedAfter2000Index", text: { path: "title", query: "foo" }, sort: { released: 1 } } } ])
[ { _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
コレクションでアキュムレーションを検索できます。また、 MongoDB Search は Decimal128
型をサポートしていないため、値を Double
に変換します。
mongosh
を使用してクラスターに接続します。
詳細については、「mongosh経由でクラスターに接続する」を参照してください。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
警告: ナビゲーションの改善が進行中次の手順が Atlas UIのビューと一致しない場合は、プレビュー ドキュメントを参照してください。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
インデックスの設定を開始します。
ページで次の選択を行い、Next をクリックしてください。
Search Type | MongoDB Search のインデックスタイプを選択します。 |
Index Name and Data Source | 以下の情報を指定してください。
|
Configuration Method | For a guided experience, select Visual Editor. To edit the raw index definition, select JSON Editor. |
重要:
MongoDB Searchインデックスの名前はデフォルトで default
です。この名前を維持する場合、インデックスは、演算子に別の index
オプションを指定していないMongoDB Search クエリのデフォルトの検索インデックスになります。複数のインデックスを作成する場合は、インデックス間で一貫した記述的な命名規則を維持することをお勧めします。
totalPriceIndex
インデックスにクエリを実行します。
注意
次の例では、totalPriceIndex
インデックスに対して .aggregate
コマンドを実行し、listingsAndReviews_totalPrice
という名前のビューを検索します。クラスターが MongoDB v8.0 を実行している場合、ビューのインデックスを使用して、ソースコレクション(例: listingsAndReviews
)をクエリする必要があります。ビューを直接クエリするために、MongoDB v8.1 以降にアップグレードしてください。
use sample_airbnb db.listingsAndReviews_totalPrice.aggregate([ { $search: { index: "totalPriceIndex", range: { path: "totalPrice", lte: 300 }, returnStoredSource: true } } ])
[ { _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 } ]
mongosh
を使用して MongoDB 配置に接続します。
詳細については、「mongosh経由でクラスターに接続する」を参照してください。
totalPriceIndex
インデックスにクエリを実行します。
注意
次の例では、totalPriceIndex
インデックスに対して .aggregate
コマンドを実行し、listingsAndReviews_totalPrice
という名前のビューを検索します。クラスターが MongoDB v8.0 を実行している場合、ビューのインデックスを使用して、ソースコレクション(例: listingsAndReviews
)をクエリする必要があります。ビューを直接クエリするために、MongoDB v8.1 以降にアップグレードしてください。
use sample_airbnb db.listingsAndReviews_totalPrice.aggregate([ { $search: { index: "totalPriceIndex", range: { path: "totalPrice", lte: 300 }, returnStoredSource: true } } ])
[ { _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") ] } } } ] } )
このコマンドを実行すると、 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
インデックスは次のシナリオで 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 Searchインデックスを作成すると、ステップ 1 と 2 中にビュー定義が適用され、変換されたドキュメントはディスク上のMongoDB Searchインデックスに保存されます。
詳細
ビューの詳細については、「ビュー」を参照してください。
ビューにMongoDB ベクトル検索インデックスを作成するには、「 MongoDB ベクトル検索でビューを使用する 」を参照してください。