Docs Menu
Docs Home
/
データベース マニュアル
/ / /

$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 キーワードが提供されます。

詳細については、Atlas Search のドキュメントを参照してください。

重要

次の $meta キーワードは、Stable API V1 でサポートされていません。

  • "textScore"

  • "indexKey"

  • "searchScore"

  • "searchHighlights"

  • "searchSequenceToken"

  • "searchScoreDetails"

  • { $meta: "textScore" } 式は $text と組み合わせて使用する必要があります。以下に例を挙げます。

    • 集計では、後のステージで { $meta: "textScore" } 式を使用するために、パイプライン内で $text クエリを使用して $match ステージを指定する必要があります。$matchステージで $text クエリを指定しない場合は、操作は失敗します。

    • find では、{ $meta: "textScore" } を使用するには、クエリ述語に $text 演算子を指定する必要があります。クエリ述語に $text 演算子を指定しないと、操作は失敗します。

    注意

    $text は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。

  • 集計では、{ $meta: "textScore" } 式は、$project$group$sort などの集計式を受け入れるさまざまなステージに含めることができます。

  • find では、{ $meta: "textScore" } 式をプロジェクションsort() に含めることができます。

  • { $meta: "textScore" } 式をプロジェクションドキュメントの一部にすると、テキスト スコア メタデータを含めることができます。

  • $meta式は、包含または除外のいずれかのプロジェクションに存在することができます。

  • ドキュメントにすでに存在するフィールド名に式を設定すると、プロジェクションのメタデータの値が既存の値を上書きします。

  • 集計では、テキスト スコア値を含むフィールドを出力するステージに続く以降のステージにおいて、クエリ条件を指定したり、そのフィールド上で操作したりできます。 たとえば、「自己管理型配置の集計パイプラインの $text 」を参照してください。

  • find では、テキスト スコアにクエリ条件を指定することはできません。代わりに集計を使用してください。

  • { $meta: "textScore" } 式をソート操作の一部として使用すると、テキスト スコア メタデータを基準にソートできます。つまり、

    • 集計では、$sort ステージです。

    • find では、sort() メソッドです。

  • "textScore" メタデータは降順でソートされます。

  • ソート操作で使用するには、{ $meta: "textScore" } 式を任意のフィールド名に設定します。フィールド名はクエリ システムによって無視されます。

  • 集計では、textScore をプロジェクトしなくても、結果のドキュメントを { $meta: "textScore" } でソートできます。

  • find では、textScore をプロジェクションしなくても、結果のドキュメントを { $meta: "textScore" } でソートすることができます。

  • 集計では、プロジェクションとソートの両方に{ $meta: "textScore" }式を含めると、プロジェクションとソートで式のフィールド名が異なる場合があります。 ソート内のフィールド名はクエリ システムによって無視されます。

  • find では、プロジェクションとソートの両方に{ $meta: "textScore" }式を含めると、プロジェクションとソートで式のフィールド名が異なる場合があります。 ソート内のフィールド名はクエリ システムによって無視されます。

  • { $meta: "indexKey" } 式はデバッグ目的のみで使用され、アプリケーション ロジックには使用できません。

  • { $meta: "indexKey" } 式は cursor.returnKey() よりも優先されます。

  • 集計では{ $meta: "indexKey" } 式は、$project$group$sortByCount などの集計式を受け入れるさまざまなステージに含めることができますが、$sort には含めることができません。ただし、集計パイプラインを使用すると、最初に{ $meta: "indexKey" } 式($project$addFields など)をプロジェクトし、その後、後続の $sort ステージでそのフィールドによってソートできます。

  • find では{ $meta: "indexKey" } 式はプロジェクション ドキュメントの一部としてのみ使用できます。

  • 返される値は、データベースがインデックスの値を表す方法によって異なり、バージョンによって変わる場合があります。表される値は、フィールドの実際の値と異なる場合があります。

  • 返される値は、システムによって選択された実行プランによって異なります。たとえば、クエリに答えるために使用できるインデックスが 2 つある場合、"indexKey" メタデータの値は、選択されているインデックスによって異なります。

  • インデックスが使用されない場合{ $meta: "indexKey" } 式は値を返さず、フィールドは出力の一部に含まれません。

次のドキュメントを使用して 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" } 式はデバッグ目的のみで使用され、アプリケーション ロジックには使用できません。MongoDB は、クエリ システムによって選択されたインデックスに関連付けられた値を返します。システムは、その後の実行時に別のインデックスを選択することができます。

選択したインデックスで返される値は、データベースがインデックスの値を表す方法によって異なり、バージョンによって変わる場合があります。表される値は、フィールドの実際の値と異なる場合があります。

次のドキュメントを使用して orders コレクションを作成します。

db.orders.insertMany([
{ "item" : "abc", "price" : Decimal128("12"), "quantity" : 2, "type": "apparel" },
{ "item" : "jkl", "price" : Decimal128("20"), "quantity" : 1, "type": "electronics" },
{ "item" : "abc", "price" : Decimal128("10"), "quantity" : 5, "type": "apparel" }
])

type フィールドと item フィールドに次の複合インデックスを作成します。

db.orders.createIndex( { type: 1, item: 1 } )

次の集計操作は、 typeapparelに等しいすべてのドキュメントを検索し、インデックスが使用されている場合は、 $metaオペレーターを使用して一致するドキュメントのインデックス キー値を含めます。

db.orders.aggregate(
[
{ $match: { type: "apparel" } },
{ $addFields: { idxKey: { $meta: "indexKey" } } }
]
)

次の操作は、 typeapparelに等しいすべてのドキュメントを検索し、インデックスが使用されている場合は、 $metaオペレーターを使用して一致するドキュメントのインデックス キー値を含めます。

db.orders.find( { type: "apparel" }, { idxKey: { $meta: "indexKey" } } )

この操作では、対応するインデックス キーを持つ一致するドキュメントが返されます。

{
"_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcde"),
"item" : "abc",
"price" : Decimal128("12"),
"quantity" : 2,
"type" : "apparel",
"idxKey" : { "type" : "apparel", "item" : "abc" }
}
{
"_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"),
"item" : "abc",
"price" : Decimal128("10"),
"quantity" : 5,
"type" : "apparel",
"idxKey" : { "type" : "apparel", "item" : "abc" }
}

インデックスが使用されていない場合{ $meta: "indexKey" } は何も返しません。

例えば次の操作では、一致条件をサポートするインデックスがpriceフィールドに存在しないため、インデックスは使用されません。

db.orders.aggregate(
[
{ $match: { price: { $gte: Decimal128("10") } } },
{ $addFields: { idxKey: { $meta: "indexKey" } } }
]
)

例えば次の操作では、一致条件をサポートするインデックスがpriceフィールドに存在しないため、インデックスは使用されません。

db.orders.find(
{ price: { $gte: Decimal128("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"
}

このページのC#の例では、Atlasサンプルデータセットsample_mflixデータベースを使用します。MongoDB Atlasクラスターを無料で作成して、サンプルデータセットをロードする方法については、 MongoDB .NET/ C#ドライバーのドキュメントの「 開始 」を参照してください。

次の Movie クラスは、sample_mflix.movies コレクション内のドキュメントをモデル化します。

public class Movie
{
public ObjectId Id { get; set; }
public string Plot { get; set; }
public List<string> Genres { get; set; }
public int Runtime { get; set; }
public List<string> Cast { get; set; }
public string Title { get; set; }
[BsonElement("lastupdated")]
public DateTime LastUpdated { get; set; }
public string Rated { get; set; }
public int Year { get; set; }
public ImdbData Imdb { get; set; }
public string Type { get; set; }
public int Index { get; set; }
public string[] Comments { get; set; }
public List<BsonDocument> Highlights { get; set; }
public float Score { get; set; }
[BsonElement("scoreDetails")]
public SearchScoreDetails ScoreDetails { get; set; }
[BsonElement("searchScoreDetails")]
public SearchScoreDetails SearchScoreDetails { get; set; }
[BsonElement("paginationToken")]
public string PaginationToken { get; set; }
[BsonElement("plot_embedding")]
public float[] PlotEmbedding { get; set; }
}

注意

パスカルケース用の ConventionPack

このページのC#クラスはプロパティ名にパスカルケースを使用しますが、 MongoDBコレクション内のフィールド名はキャメルケースを使用します。この違いを考慮するには、アプリケーションの起動時に次のコードを使用して ConventionPack を登録します。

var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);

.NET/ C#ドライバーを使用してテキスト検索スコアを含めるには、プロジェクションビルダーで MetaTextScore() メソッドを呼び出します。

まず、次のコードを実行して、Titleフィールドにテキストインデックスを作成します。

var indexModel = new CreateIndexModel<Movie>(
Builders<Movie>.IndexKeys.Text(m => m.Title));
movieCollection.Indexes.CreateOne(indexModel);

次に、アプリケーションに次のコードを追加します。このコードでは、"future" というタームのテキスト検索が実行され、MetaTextScore() メソッドを使用して、一致する各ドキュメントに割り当てられたスコアが含まれます。次に、コードは結果をテキスト スコアの降順でソートし、ドキュメントが最も高いドキュメントを返します。

var filter = Builders<Movie>.Filter.Text("future");
var projection = Builders<Movie>.Projection
.Include(m => m.Title)
.Include(m => m.Plot)
.MetaTextScore(m => m.Score);
var result = movieCollection.Find(filter)
.Sort(Builders<Movie>.Sort.MetaTextScore("score"))
.Project(projection)
.FirstOrDefault();

上記の操作では、次のドキュメントが返されます。

{
"_id": {
"$oid": "573a1398f29313caabceb500"
},
"plot": "After visiting 2015, Marty McFly must repeat his visit to 1955 to
prevent disastrous changes to 1985... without interfering with his first trip.",
"title": "Back to the Future Part II",
"score": 1.59375
}

戻る

$mergeObjects

項目一覧