“文档” 菜单
文档首页
/
MongoDB Manual
/ / /

$meta

在此页面上

  • 定义
  • 行为
  • 举例
$meta

返回与文档关联的元数据,例如执行文本搜索时返回 "textScore"

$meta 表达式的语法如下:

{ $meta: <metaDataKeyword> }

$meta 表达式可以指定以下值作为 <metaDataKeyword>

關鍵字
说明
"textScore"

返回与每个匹配文档的相应 $text查询关联的分数。文本分数表示文档与一个或多个搜索词的匹配程度。

{ $meta: "textScore" } 必须与$text查询结合使用。

在早期版本中,如果不与$text查询结合使用,则返回 null 分数。

注意

$text 为自管理(非 Atlas)部署提供文本查询功能。对于 MongoDB Atlas 上托管的数据,MongoDB 提供了改进的全文查询解决方案Atlas Search。

"indexKey"
如果使用非文本索引,则返回文档的索引键。{ $meta: "indexKey" }表达式仅用于调试目的,不用于应用程序逻辑,并且比 cursor.returnKey() 更受青睐。

MongoDB Atlas Search 提供其他 $meta 关键字,例如:

有关详细信息,请参阅 Atlas Search 文档。

重要

Stable API V1 不支持以下 $meta 关键字:

  • "textScore"

  • "indexKey"

  • "searchScore"

  • "searchHighlights"从 MongoDB 7.0.5 和 6.0.13 开始可用

  • { $meta: "textScore" }表达式必须与$text结合使用。例如:

    • 在聚合中,您必须在管道中指定具有$text查询的$match阶段,才能在后续阶段中使用{ $meta: "textScore" }表达式。如果在$match阶段未指定$text查询,则操作将失败。

    • 在查找中,您必须在查询谓词中指定$text操作符才能使用{ $meta: "textScore" } 。如果未在查询谓词中指定$text操作符,则操作将失败。

    注意

    $text 为自管理(非 Atlas)部署提供文本查询功能。对于 MongoDB Atlas 上托管的数据,MongoDB 提供了改进的全文查询解决方案Atlas Search。

  • 聚合时,{ $meta: "textScore" } 表达式可以包含在接受聚合表达式的各个阶段中,例如 $project$group$sort 等。

  • 在查找中,{ $meta: "textScore" } 表达式可以包含在投影sort() 中。

  • { $meta: "textScore" } 表达式可以作为投影文档的一部分,以包含文本得分元数据。

  • $meta 表达式可以出现在包含投影或排除投影中。

  • 如果将表达式设置为文档中已存在的字段名称,则投影的元数据值将覆盖现有值。

  • 聚合时,在输出文本分数值字段的阶段之后,可以在后续阶段指定查询条件或对该字段进行操作。例如,请参阅聚合管道中的 $text。

  • 在查找中,不能对文本得分指定查询条件。请改用聚合。

  • { $meta: "textScore" } 表达式可用作排序操作的一部分,以按文本得分元数据进行排序;也即

    • 聚合时,$sort 阶段。

    • 查找时,sort() 方法。

  • "textScore" 元数据按降序排序。

  • 要在排序操作中使用,可将 { $meta: "textScore" } 表达式设置为任意字段名称。查询系统会忽略字段名称。

  • 聚合时,可以按 { $meta: "textScore" } 对结果文档进行排序,而无需投影 textScore

  • 在查找中,您可以按 { $meta: "textScore" } 对结果文档进行排序,而无需投影 textScore

  • 在聚合中,如果投影和排序都包含 { $meta: "textScore" } 表达式,则投影和排序可以为该表达式使用不同的字段名称。被查询系统忽略的排序中的字段名称。

  • 在查找中,如果投影和排序都包含 { $meta: "textScore" } 表达式,则投影和排序可以为该表达式使用不同的字段名称。查询系统忽略排序中的字段名称。

  • { $meta: "indexKey" } 表达式仅用于调试目的,不适用于应用程序逻辑。

  • { $meta: "indexKey" } 表达式优先于 cursor.returnKey()

  • 聚合时{ $meta: "indexKey" } 表达式可以包含在接受聚合表达式的各个阶段,例如 $project$group$sortByCount 等,但不包含 $sort。但是,使用聚合管道,可以先投影 { $meta: "indexKey" } 表达式(例如在 $project$addFields 等中),然后在后续 $sort 阶段按该字段排序。

  • 在查找中{ $meta: "indexKey" } 表达式只能作为投影文档的一部分使用。

  • 返回的值取决于数据库在索引中表示值的方式,并且可能会因版本而异。所表示的值可能不是该字段的实际值。

  • 返回的值取决于系统选择的执行计划。例如,如果有两个可能用于回答查询的索引,那么“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: "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" }
])

typeitem 字段上创建以下复合索引:

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

该操作会返回匹配的文档及其相应的索引键:

{
"_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" } 不会返回任何内容。

此操作将返回不含 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"
}
← $mergeObjects(聚合)

在此页面上