メタデータフィルター
Mastra は、MongoDB/Sift のクエリ構文に基づく統一されたメタデータフィルタリング構文を、すべてのベクトルストアに提供します。各ベクトルストアは、これらのフィルターをネイティブのクエリ形式に変換します。たとえば、PgVector は PostgreSQL の JSONB 述語を使用します。一方、OracleDB はメタデータを Oracle JSON として保存し、フィルターを値がバインドされた JSON_VALUE、JSON_EXISTS、REGEXP_LIKE、LIKE 述語にコンパイルします。
基本的な例基本的な例への直接リンク
import { PgVector } from '@mastra/pg'
const store = new PgVector({
id: 'pg-vector',
connectionString,
})
const results = await store.query({
indexName: 'my_index',
queryVector: queryVector,
topK: 10,
filter: {
category: 'electronics', // Simple equality
price: { $gt: 100 }, // Numeric comparison
tags: { $in: ['sale', 'new'] }, // Array membership
},
})
サポートされている演算子サポートされている演算子への直接リンク
基本的な比較
$eq指定した値と等しい値に一致します
{ age: { $eq: 25 } }
Supported by: Couchbase を除くすべて
$ne等しくない値に一致します
{ status: { $ne: 'inactive' } }
Supported by: Couchbase を除くすべて
$gtより大きい
{ price: { $gt: 100 } }
Supported by: Couchbase を除くすべて
$gte以上
{ rating: { $gte: 4.5 } }
Supported by: Couchbase を除くすべて
$ltより小さい
{ stock: { $lt: 20 } }
Supported by: Couchbase を除くすべて
$lte以下
{ priority: { $lte: 3 } }
Supported by: Couchbase を除くすべて
配列演算子
$in配列内のいずれかの値に一致します
{ category: { $in: ["A", "B"] } }
Supported by: Couchbase を除くすべて
$ninどの値にも一致しません
{ status: { $nin: ["deleted", "archived"] } }
Supported by: Couchbase を除くすべて
$allすべての要素を含む配列に一致します
{ tags: { $all: ["urgent", "high"] } }
Supported by: Astra, Pinecone, Upstash, MongoDB, OracleDB
$elemMatch条件を満たす配列要素に一致します
{ scores: { $elemMatch: { $gt: 80 } } }
Supported by: libSQL, PgVector, MongoDB, OracleDB
論理演算子
$and論理 AND
{ $and: [{ price: { $gt: 100 } }, { stock: { $gt: 0 } }] }
Supported by: Vectorize、Couchbase を除くすべて
$or論理 OR
{ $or: [{ status: "active" }, { priority: "high" }] }
Supported by: Vectorize、Couchbase を除くすべて
$not論理 NOT
{ price: { $not: { $lt: 100 } } }
Supported by: Astra, Qdrant, Upstash, PgVector, libSQL, MongoDB, OracleDB
$nor論理 NOR
{ $nor: [{ status: "deleted" }, { archived: true }] }
Supported by: Qdrant, Upstash, PgVector, libSQL, MongoDB, OracleDB
要素演算子
$existsフィールドを持つドキュメントに一致します
{ rating: { $exists: true } }
Supported by: Vectorize、Chroma、Couchbase を除くすべて
カスタム演算子
$containsテキストに部分文字列が含まれるかを判定します
{ description: { $contains: "sale" } }
Supported by: Upstash, libSQL, PgVector, OracleDB
$regex正規表現に一致するかを判定します
{ name: { $regex: "^test" } }
Supported by: Qdrant, PgVector, Upstash, MongoDB, OracleDB
$size配列の長さを確認します
{ tags: { $size: 3 } }
Supported by: Astra, libSQL, PgVector, MongoDB, OracleDB
$geo地理空間クエリ
{ location: { $geo: { type: "radius", ... } } }
Supported by: Qdrant
$datetime日時範囲クエリ
{ created: { $datetime: { range: { gt: "2024-01-01" } } } }
Supported by: Qdrant
$hasIdベクトル ID の存在確認
{ $hasId: ["id1", "id2"] }
Supported by: Qdrant
$hasVectorベクトルの存在確認
{ $hasVector: true }
Supported by: Qdrant
共通のルールと制約共通のルールと制約への直接リンク
-
フィールド名には次の制約があります。
- ネストされたフィールドを参照する場合を除き、ドット(.)を含めることはできません
- $ で始めることや、null 文字を含めることはできません
- 空文字列にすることはできません
-
値は次の要件を満たす必要があります。
- 有効な JSON 型(文字列、数値、真偽値、オブジェクト、配列)であること
- undefined でないこと
- 演算子に適した型であること(例:数値比較には数値)
-
論理演算子には次の制約があります。
- 有効な条件を含める必要があります
- 空にすることはできません
- 適切にネストする必要があります
- 最上位、またはほかの論理演算子内でのみ使用できます
- フィールドレベル、またはフィールド内では使用できません
- 演算子内では使用できません
- 有効:
{ "$and": [{ "field": { "$gt": 100 } }] } - 有効:
{ "$or": [{ "$and": [{ "field": { "$gt": 100 } }] }] } - 無効:
{ "field": { "$and": [{ "$gt": 100 }] } } - 無効:
{ "field": { "$gt": { "$and": [{...}] } } }
-
$not 演算子には次の制約があります。
- オブジェクトである必要があります
- 空にすることはできません
- フィールドレベルまたは最上位で使用できます
- 有効:
{ "$not": { "field": "value" } } - 有効:
{ "field": { "$not": { "$eq": "value" } } }
-
演算子のネストには次の制約があります。
- 論理演算子には、演算子を直接指定するのではなく、フィールド条件を含める必要があります
- 有効:
{ "$and": [{ "field": { "$gt": 100 } }] } - 無効:
{ "$and": [{ "$gt": 100 }] }
ストア固有の注意事項ストア固有の注意事項への直接リンク
AstraAstraへの直接リンク
- ドット記法を使用したネストされたフィールドのクエリをサポートします
- 配列フィールドは、メタデータ内で配列として明示的に定義する必要があります
- メタデータの値では大文字と小文字が区別されます
ChromaDBChromaDBへの直接リンク
- Where フィルターは、フィルター対象フィールドがメタデータに存在する結果のみを返します
- 空のメタデータフィールドはフィルター結果に含まれません
- 否定一致にはメタデータフィールドが存在する必要があります(例:$ne はフィールドがないドキュメントには一致しません)
Cloudflare VectorizeCloudflare Vectorizeへの直接リンク
- フィルタリングを使用する前に、メタデータを明示的にインデックス化する必要があります
- フィルター対象にするフィールドのインデックスを作成するには、
createMetadataIndex()を使用します - Vectorize インデックスごとに最大 10 個のメタデータインデックスを作成できます
- 文字列値は先頭の 64 バイトまでインデックス化されます(UTF-8 の境界で切り詰められます)
- 数値には float64 精度が使用されます
- フィルターの JSON は 2048 バイト未満である必要があります
- フィールド名にドット(.)を含めることや、$ で始めることはできません
- フィールド名は 512 文字までです
- 新しいメタデータインデックスの作成後、フィルター結果にベクトルを含めるには、そのベクトルを再度 upsert する必要があります
- 非常に大規模なデータセット(約 1,000 万以上のベクトル)では、範囲クエリの精度が低下する場合があります
libSQLlibSQLへの直接リンク
- ドット記法によるネストされたオブジェクトのクエリをサポートします
- 配列フィールドが有効な JSON 配列を含むことを検証します
- 数値比較では型が適切に処理されます
- 条件内の空配列は適切に処理されます
- 効率的にクエリできるよう、メタデータは JSONB 列に保存されます
OracleDBOracleDBへの直接リンク
- メタデータは各
VECTOR行とともに Oracle JSON として保存されます - スカラー比較では
JSON_VALUEを使用し、配列、存在確認、要素一致のチェックではJSON_EXISTSを使用します $regexでは Oracle のREGEXP_LIKEを使用し、文字列の$containsでは大文字と小文字を区別しないLIKEを使用します- ネストされたフィールドはドット記法でサポートされ、引用符で囲まれた Oracle JSON パスに変換されます
- ユーザーが指定したメタデータ値は、SQL に埋め込まれず、パラメーターとしてバインドされます
PgVectorPgVectorへの直接リンク
- PostgreSQL ネイティブの JSON クエリ機能を完全にサポートします
- ネイティブの配列関数を使用して配列操作を効率的に処理します
- 数値、文字列、真偽値の型を適切に処理します
- ネストされたフィールドのクエリでは、内部的に PostgreSQL の JSON パス構文を使用します
- 効率的にインデックス化できるよう、メタデータは JSONB 列に保存されます
PineconePineconeへの直接リンク
- メタデータのフィールド名は 512 文字までです
- 数値は ±1e38 の範囲内である必要があります
- メタデータ内の配列は合計 64KB までです
- ネストされたオブジェクトはドット記法でフラット化されます
- メタデータを更新すると、メタデータオブジェクト全体が置き換えられます
QdrantQdrantへの直接リンク
- ネストされた条件を使用した高度なフィルタリングをサポートします
- フィルタリングする Payload(メタデータ)フィールドは、明示的にインデックス化する必要があります
- フィルター対象にするフィールドのインデックスを作成するには、
createPayloadIndex()を使用します。
// Index a field before filtering on it
await store.createPayloadIndex({
indexName: 'my_index',
fieldName: 'source',
fieldSchema: 'keyword', // 'keyword' | 'integer' | 'float' | 'geo' | 'text' | 'bool' | 'datetime' | 'uuid'
})
// Now filtering works
const results = await store.query({
indexName: 'my_index',
queryVector: queryVector,
filter: { source: 'document-a' },
})
- 地理空間クエリを効率的に処理します
- null 値と空の値を特別に処理します
- ベクトル固有のフィルタリング機能を備えています
- 日時の値は RFC 3339 形式である必要があります
UpstashUpstashへの直接リンク
- メタデータフィールドのキーは 512 文字までです
- クエリサイズには制限があります(大きな IN 句は避けてください)
- フィルター内の null/undefined 値はサポートされません
- 内部的に SQL に似た構文へ変換されます
- 文字列比較では大文字と小文字が区別されます
- メタデータの更新はアトミックです
MongoDBMongoDBへの直接リンク
- メタデータフィルターで MongoDB/Sift クエリ構文を完全にサポートします
- 標準の比較、配列、論理、要素演算子をすべてサポートします
- メタデータ内のネストされたフィールドと配列をサポートします
filterオプションとdocumentFilterオプションをそれぞれ使用し、metadataと元のドキュメント内容の両方にフィルタリングを適用できますfilterはメタデータオブジェクトに適用され、documentFilterは元のドキュメントフィールドに適用されます- フィルターのサイズや複雑さに人為的な制限はありません(MongoDB のクエリ制限には従います)
- 最適なパフォーマンスを得るには、メタデータフィールドのインデックス化を推奨します
CouchbaseCouchbaseへの直接リンク
- 現在、メタデータフィルターはサポートされていません。結果の取得後にクライアント側でフィルタリングするか、より複雑なクエリでは Couchbase SDK の Search 機能を直接使用する必要があります。
Amazon S3 VectorsAmazon S3 Vectorsへの直接リンク
- 等価条件の値にはプリミティブ値(文字列、数値、真偽値)を指定する必要があります。等価条件では
null/undefined、配列、オブジェクト、Date は使用できません。範囲演算子は数値または Date を受け取ります(Date はエポックミリ秒に正規化されます)。 $in/$ninには、空でないプリミティブ値の配列が必要です。Date 要素も使用でき、エポックミリ秒に正規化されます。配列の等価比較はサポートされていません。- 暗黙の AND は正規化されます(
{a:1,b:2}→{$and:[{a:1},{b:2}])。論理演算子にはフィールド条件を含む空でない配列を指定する必要があります。論理演算子はルート、またはほかの論理演算子内にのみ配置できます(フィールド値の内部には配置できません)。 - インデックス作成時に
nonFilterableMetadataKeysに指定したキーは保存されますが、フィルターには使用できません。この設定は変更できません。 - $exists には真偽値を指定する必要があります。
- undefined/null/空のフィルターは、フィルターなしとして扱われます。
- 各メタデータキーの名前は 63 文字までです。
- ベクトルごとのメタデータ合計:最大 40 KB(フィルター可能 + フィルター不可)
- ベクトルごとのメタデータキー合計:最大 10 個
- ベクトルごとのフィルター可能なメタデータ:最大 2 KB
- ベクトルインデックスごとのフィルター不可のメタデータキー:最大 10 個