AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

MongoDB ベクトル検索のマルチテナント アーキテクチャをビルドする

You can implement multi-tenancy with MongoDB Vector Search so that a single instance of an application serves multiple tenants. This page describes design recommendations that apply specifically to MongoDB Vector Search. These recommendations differ from our multi-tenancy recommendations for Atlas.

MongoDB ベクトル検索のマルチテナント アーキテクチャを設計する際には、次の推奨事項を参照してください。

重要

このガイダンスでは、単一のVPC内にテナントを配置できることを前提としています。それ以外の場合は、テナントごとに個別のプロジェクトを維持する必要があります。これはMongoDB ベクトル検索には推奨されません。

すべてのテナントデータを単一のコレクション、データベース、およびクラスターに保存することをお勧めします。各ドキュメント内に tenant_id フィールドを含めることで、テナントを区別できます。このフィールドは、UUID やテナント名など、テナントの一意の識別子になります。このフィールドは、MongoDB ベクトル検索インデックスやクエリのプレフィルターとして使用できます。

この集中型アプローチには、以下の利点があります。

  • モデル化と増やすことが容易。

  • メンテナンス操作を簡素化

  • tenant_id によるプレフィルターでクエリルーティングを効率化

    注意

    このフィルターは、このフィルターに一致するテナントのデータのみをクエリが返すことを保証します。

次の理由で、各テナントを個別のコレクションまたはデータベースに保存することは推奨されません。

  • パフォーマンスへの影響: このアプローチでは、コレクションの数に応じて変更ストリームの負荷が異なる可能性があり、パフォーマンスとモニタリング機能に悪影響を影響可能性があります。

  • 追加の分離なし: Atlas のデータ分離保証はデータベースレベルで適用されます。同じデータベース内で個別のコレクションを使用しても、追加のデータ分離の利点は得られません。別個のデータベースを使用すると運用が複雑になり、ほとんどのユースケースで意味のあるセキュリティ上の利点はありません。

Instead, use one collection for all tenants. For an example of how to migrate from a collection-per-tenant model to a single collection model, see Migrating from a Collection-Per-Tenant Model.

次の戦略を考慮し、推奨アプローチを使用してパフォーマンスに関する潜在的な問題を軽減してください。

それぞれのドキュメント数が比較的少ないテナントが多い場合、またはデータの分散が不均衡であるためにパフォーマンスの問題が発生している場合(一部の大規模テナントと多数の小規模テナント)は、次の戦略を検討してください。

多数のテナントがあり(最大1 00 万)、各テナントのドキュメント数が比較的に少ない場合(それぞれ10 000 ドキュメント未満)は、デフォルトのHierarchical Navigable Small Worlds インデックスではなく、flat インデックスを使用します。フラット インデックスを作成するには、インデックス定義で indexingMethod フィールドを flat に設定します。

各テナントのドキュメント数が少ない場合、特定のテナントにフィルターされたクエリはすでに徹底的に検索されています。このような場合、Hierarchical Navigable Small Worlds グラフはメモリとメンテナンスのオーバーヘッドを増やすだけで、メリットはありません。フラット インデックスにより、この不要なオーバーヘッドが解消されます。

フラット インデックスは、マルチテナント ワークロードに対して次の利点を提供します。

  • 選択的フィルターに最適化: 各テナントのドキュメント数が少ない選択性の高いクエリでは、網羅的なスキャンがすでに最速のパスです。平面インデックスはこれを直接サポートするため、レイテンシと再現率の両方が向上します。

  • 予測可能なパフォーマンス: どのテナントが対象になっているかに関係なく、クエリのレイテンシが緊密な範囲内に収まるため、テナント間の近隣地域影響を排除できます。

  • リソース効率: 平面インデックスにより、Hierarchical Navigable Small Worlds グラフの構築に関連するメモリとメンテナンスのオーバーヘッドが排除されます。

例えば、次のインデックス定義は、tenant_id フィルターフィールドを使用してフラットインデックスを作成します。MongoDB ベクトル検索で Voyage AI モデルを使用して埋め込みを自動的に生成する場合は autoEmbed タイプを選択します。または、既に埋め込みがある場合は vector タイプを選択します。

例: 自動埋め込みインデックス
{
"fields": [
{
"type": "autoEmbed",
"modality": "text",
"path": "<fieldToIndex>",
"model": "<embeddingModel>",
"indexingMethod": "flat"
},
{
"type": "filter",
"path": "tenant_id"
}
]
}

注意

平面インデックスは、autoEmbed タイプで自動埋め込みを使用するか、vector タイプで既存の埋め込みを使用するかにかかわらず、スカラーおよびバイナリ量子化と互換性があります。平面インデックスを使用する場合は、常に tenant_id フィールドをプレフィルターとしてクエリに含めてください。

それぞれのドキュメント数が 10、000 よりも大きい大規模なテナントの場合は、Hierarchical Navigable Small Worlds インデックスを MongoDBビュー で使用して、大規模なテナントと小規模なテナントを区別します。

  • 大規模テナント(上位 1%):

    • 大規模なテナントごとにビューを作成してください。

    • 各ビューに対してHierarchical Navigable Small Worldsインデックスを作成します。

    • 大規模テナントの記録を保持し、クエリ時に確認してそれに応じてクエリをルーティングします。

  • 小規模テナント(残りのテナント):

    • すべての小規模テナント用にビューを 1 つ作成します。

    • Build a single flat index for this view.

    • tenant_idフィールドをプレフィルターとして使用し、それに応じてクエリをルーティングします。

The following example demonstrates how to create views for large and small tenants by using mongosh:

大規模テナントとそれに対応する tenant_id の値を記録し、これらのテナントごとにビューを作成します。

db.createView(
"<viewName>",
"<collectionName>",
[
{
"$match": {
"tenant_id": "<largeTenantId>"
}
}
]
)

ビューを作成した後、各ビューのインデックスを作成してください。次の点を確認してください。

  • インデックスのコレクション名を指定する際は、元のコレクション名ではなく、ビュー名を使用してください。

  • 大規模なテナント ビューの場合は、Hierarchical Navigable Small Worldsインデックス (デフォルト) を作成します。

  • For the small tenant view, create an index with the flat indexing method and include the tenant_id field as a pre-filter.

インデックスの作成について詳しくは、「インデックスの作成」ページを参照してください。

If you have many tenants that each have a large number of documents, consider using a partition-based system by distributing data across shards.

You can use the tenant_id field as a shard key to distribute the data across specific ranges based on the tenant ID. For more information, see Ranged Sharding.

テナントごとのコレクション モデルから単一コレクション モデルに移行するには、各テナントのコレクションを処理し、ドキュメントを新しいコレクションに挿入します。