$meta
定義
$meta
ドキュメントに関連付けられたメタデータを返します。例:テキスト検索を実行すると返される
"textScore"
。$meta
式の構文は次のとおりです。{ $meta: <metaDataKeyword> } $meta
式では、<metaDataKeyword>
として次の値を指定できます。Keyword説明"textScore"
一致するドキュメントごとに、対応する
$text
クエリに関連付けられたスコアを返します。テキスト スコアは、ドキュメントが 1 つまたは複数の検索タームにどの程度一致したかを示します。{ $meta: "textScore" }
$text
クエリと組み合わせて使う必要があります。前のバージョンでは、
$text
クエリと組み合わせて使用されない場合、null スコアが返されます。$text
は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。"indexKey"
テキスト以外のインデックスが使用されている場合、ドキュメントのインデックス キーを返します。{ $meta: "indexKey" }
式はデバッグ目的のみで使用され、アプリケーション ロジックには使用されず、cursor.returnKey()
よりも優先されます。MongoDB Atlas Search では、次のような追加の
$meta
キーワードが提供されます。"searchSequenceToken" ( MongoDB 6.0.13および7.0.5から利用可能)
詳細については、Atlas Search のドキュメントを参照してください。
動作
テキスト スコア メタデータ $meta: "textScore"
$text 検索が必要です
{ $meta: "textScore" }
式は$text
と組み合わせて使用する必要があります。以下に例を挙げます。集計では、後のステージで
{ $meta: "textScore" }
式を使用するために、パイプライン内で$text
クエリを使用して$match
ステージを指定する必要があります。$match
ステージで$text
クエリを指定しない場合は、操作は失敗します。find では、
{ $meta: "textScore" }
を使用するには、クエリ述語に$text
演算子を指定する必要があります。クエリ述語に$text
演算子を指定しないと、操作は失敗します。
注意
$text
は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。
可用性
プロジェクションでの使用
テキスト スコアでフィルタリング
集計では、テキスト スコア値を含むフィールドを出力するステージに続く以降のステージにおいて、クエリ条件を指定したり、そのフィールド上で操作したりできます。 たとえば、「自己管理型配置の集計パイプラインの $text 」を参照してください。
find では、テキスト スコアにクエリ条件を指定することはできません。代わりに集計を使用してください。
ソートでの使用
プロジェクションを使わないソート
集計では、
textScore
をプロジェクトしなくても、結果のドキュメントを{ $meta: "textScore" }
でソートできます。find では、
textScore
をプロジェクションしなくても、結果のドキュメントを{ $meta: "textScore" }
でソートすることができます。
プロジェクションによるソート
集計では、プロジェクションとソートの両方に
{ $meta: "textScore" }
式を含めると、プロジェクションとソートで式のフィールド名が異なる場合があります。 ソート内のフィールド名はクエリ システムによって無視されます。find では、プロジェクションとソートの両方に
{ $meta: "textScore" }
式を含めると、プロジェクションとソートで式のフィールド名が異なる場合があります。 ソート内のフィールド名はクエリ システムによって無視されます。
インデックス キー メタデータ $meta: "indexKey"(集計と検索)
使用法
{ $meta: "indexKey" }
式はデバッグ目的のみで使用され、アプリケーション ロジックには使用できません。{ $meta: "indexKey" }
式はcursor.returnKey()
よりも優先されます。
可用性
集計では、
{ $meta: "indexKey" }
式は、$project
、$group
、$sortByCount
などの集計式を受け入れるさまざまなステージに含めることができますが、$sort
には含めることができません。ただし、集計パイプラインを使用すると、最初に{ $meta: "indexKey" }
式($project
、$addFields
など)をプロジェクトし、その後、後続の$sort
ステージでそのフィールドによってソートできます。find では、
{ $meta: "indexKey" }
式はプロジェクション ドキュメントの一部としてのみ使用できます。
戻り値
返される値は、データベースがインデックスの値を表す方法によって異なり、バージョンによって変わる場合があります。表される値は、フィールドの実際の値と異なる場合があります。
返される値は、システムによって選択された実行プランによって異なります。たとえば、クエリに答えるために使用できるインデックスが 2 つある場合、"indexKey" メタデータの値は、選択されているインデックスによって異なります。
インデックスが使用されない場合、
{ $meta: "indexKey" }
式は値を返さず、フィールドは出力の一部に含まれません。
例
$meta: "textScore"
次のドキュメントを使用して articles
コレクションを作成します。
db.articles.insertMany([ { "_id" : 1, "title" : "cakes and ale" }, { "_id" : 2, "title" : "more cakes" }, { "_id" : 3, "title" : "bread" }, { "_id" : 4, "title" : "some cakes" }, { "_id" : 5, "title" : "two cakes to go" }, { "_id" : 6, "title" : "pie" } ])
title
フィールドにテキスト インデックスを作成します。
db.articles.createIndex( { title: "text"} )
次の集計操作はテキスト検索を実行し、 $meta
演算子を使用してテキスト検索スコアごとにグループ化します。
db.articles.aggregate( [ { $match: { $text: { $search: "cake" } } }, { $group: { _id: { $meta: "textScore" }, count: { $sum: 1 } } } ] )
この操作は次の結果を返します。
{ "_id" : 0.75, "count" : 1 } { "_id" : 0.6666666666666666, "count" : 1 } { "_id" : 1, "count" : 2 }
その他の例については、「自己管理型配置の集計パイプラインの $text 」を参照してください。
次のクエリは、タームcake
のテキスト検索を実行し、プロジェクションドキュメントで$meta
演算子を使用して、一致する各ドキュメントに割り当てられたスコアを含めます。
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } )
この操作では、テキスト スコアを含む次のドキュメントが返されます。
{ "_id" : 4, "title" : "some cakes", "score" : 1 } { "_id" : 1, "title" : "cakes and ale", "score" : 0.75 } { "_id" : 5, "title" : "two cakes to go", "score" : 0.6666666666666666 } { "_id" : 2, "title" : "more cakes", "score" : 1 }
"textScore"
のプロジェクションとソートの追加の例については、「関連性スコアの例」を参照してください。
$meta: "indexKey"
注意
{ $meta: "indexKey" }
式はデバッグ目的のみで使用され、アプリケーション ロジックには使用できません。MongoDB は、クエリ システムによって選択されたインデックスに関連付けられた値を返します。システムは、その後の実行時に別のインデックスを選択することができます。
選択したインデックスで返される値は、データベースがインデックスの値を表す方法によって異なり、バージョンによって変わる場合があります。表される値は、フィールドの実際の値と異なる場合があります。
次のドキュメントを使用して orders
コレクションを作成します。
db.orders.insertMany([ { "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type": "apparel" }, { "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type": "electronics" }, { "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type": "apparel" } ])
type
フィールドと item
フィールドに次の複合インデックスを作成します。
db.orders.createIndex( { type: 1, item: 1 } )
次の集計操作は、 type
がapparel
に等しいすべてのドキュメントを検索し、インデックスが使用されている場合は、 $meta
オペレーターを使用して一致するドキュメントのインデックス キー値を含めます。
db.orders.aggregate( [ { $match: { type: "apparel" } }, { $addFields: { idxKey: { $meta: "indexKey" } } } ] )
次の操作は、 type
がapparel
に等しいすべてのドキュメントを検索し、インデックスが使用されている場合は、 $meta
オペレーターを使用して一致するドキュメントのインデックス キー値を含めます。
db.orders.find( { type: "apparel" }, { idxKey: { $meta: "indexKey" } } )
この操作では、対応するインデックス キーを持つ一致するドキュメントが返されます。
{ "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcde"), "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"), "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } }
インデックスが使用されていない場合、{ $meta: "indexKey" }
は何も返しません。
例えば次の操作では、一致条件をサポートするインデックスがprice
フィールドに存在しないため、インデックスは使用されません。
db.orders.aggregate( [ { $match: { price: { $gte: NumberDecimal("10") } } }, { $addFields: { idxKey: { $meta: "indexKey" } } } ] )
例えば次の操作では、一致条件をサポートするインデックスがprice
フィールドに存在しないため、インデックスは使用されません。
db.orders.find( { price: { $gte: NumberDecimal("10") } }, { idxKey: { $meta: "indexKey" } } )
この操作では、idxKey
フィールドのない一致するドキュメントが返されます。
{ "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcde"), "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type" : "apparel" } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcdf"), "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type" : "electronics" } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"), "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type" : "apparel" }