Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

planCacheSetFilter

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • 必需的访问权限
  • 示例
planCacheSetFilter

为集合设置索引过滤。 如果计划缓存查询结构已经存在索引过滤,该命令将覆盖以前的索引过滤。

8.0版本新增

从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。

查询设置的功能比索引筛选器更多。 此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。 要添加查询设置并探索示例,请参阅setQuerySettings

在查询规划期间,查询优化器使用查询设置作为附加输入,这样会影响为运行查询而选择的计划。

这些设置将应用于整个集群上的查询结构。在关闭之后,集群将保留这些设置。

您可以为 finddistinctaggregate 命令添加查询设置。

要删除查询设置,请使用 removeQuerySettings。要获取查询设置,请在一个聚合管道中使用一个 $querySettings 阶段。

此命令可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

重要

M 0 、M 2和 M 5集群不支持此命令。 有关更多信息,请参阅不支持的命令。

该命令具有以下语法:

db.runCommand(
{
planCacheSetFilter: <collection>,
query: <query>,
sort: <sort>,
projection: <projection>,
collation: { <collation> },
indexes: [ <index1>, <index2>, ...],
comment: <any>
}
)

索引过滤的计划缓存查询结构是以下各项的组合:

  • query

  • sort

  • projection

  • collation

该命令具有以下字段:

字段
类型
说明

planCacheSetFilter

字符串

索引筛选器的collection名称。

query

文档

索引筛选器的查询谓词。

索引筛选器中仅使用谓词结构(包括字段名称)。 不使用查询谓词中的字段值。 因此,索引筛选器中的查询谓词由仅字段值不同的类似查询使用。

sort

文档

可选。 索引筛选器的排序。

projection

文档

可选。 索引筛选器的投影。

collation

文档

指定用于操作的排序规则

排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。

排序规则选项的语法如下:

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

指定排序规则时,locale 字段为必填字段;所有其他排序规则字段均为可选字段。有关字段的说明,请参阅排序规则文档

如果未指定排序规则,但集合具有默认排序规则(请参阅 db.createCollection()),则操作将使用为集合指定的排序规则。

如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。

您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。

从 MongoDB 6.0 开始,索引筛选器会使用之前使用 planCacheSetFilter 命令设置的排序规则

从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。

查询设置的功能比索引筛选器更多。 此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。 要添加查询设置并探索示例,请参阅setQuerySettings

indexes

阵列

指定计划缓存查询结构的索引筛选器大量。

将索引筛选器指定为以下数组之一:

  • 索引规范文档。 例如, [ { x : 1 }, ... ]

  • 索引名称。 例如, [ "x_1", ... ]

查询优化器对查询计划使用collection扫描或索引数组。如果指定的索引不存在或已隐藏,优化器将使用collection扫描。

对于具有相同键模式的多个索引,您必须将索引指定为名称数组。

comment

any

可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:

注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。

索引筛选器仅在服务器进程期间存在,在关闭后不会持续存在。 要清除索引筛选器,请使用planCacheClearFilters命令。

用户必须具有包括planCacheIndexFilter操作的访问权限。

以下示例在orders集合上创建了一个索引筛选器,这样对于仅包含status字段上的等值匹配而没有任何投影和排序的查询,查询优化器仅评估两个指定的索引,并且集合会扫描获胜计划:

db.runCommand(
{
planCacheSetFilter: "orders",
query: { status: "A" },
indexes: [
{ cust_id: 1, status: 1 },
{ status: 1, order_date: -1 }
]
}
)

在查询谓词中,只有谓词的结构(包括字段名称)重要;这些值无关紧要。 因此,创建的筛选器适用于以下操作:

db.orders.find( { status: "D" } )
db.orders.find( { status: "P" } )

要查看MongoDB是否会对计划缓存查询结构应用索引过滤,请检查indexFilterSet db.collection.explain()cursor.explain() 方法的 字段。

以下示例为orderscollection创建了一个索引筛选器。该筛选器适用于其谓词为item字段的等值匹配的查询,其中仅投影quantity字段,并指定按order_date升序排序。

db.runCommand(
{
planCacheSetFilter: "orders",
query: { item: "ABC" },
projection: { quantity: 1, _id: 0 },
sort: { order_date: 1 },
indexes: [
{ item: 1, order_date: 1 , quantity: 1 }
]
}
)

对于计划缓存查询结构,查询优化器将仅考虑使用索引{ item: 1, order_date: 1, quantity: 1 }的索引计划。

以下示例为orderscollection创建了一个索引筛选器。该筛选器适用于其谓词为item字段和排序规则en_US (美国英语)的等值匹配的查询。

db.runCommand(
{
planCacheSetFilter: "orders",
query: { item: "Movie" },
collation: { locale: "en_US" },
indexes: [
{ item: 1, order_date: 1 , quantity: 1 }
]
}
)

对于计划缓存查询结构,查询优化器仅使用使用索引{ item: 1, order_date: 1, quantity: 1 }的索引计划。

从 MongoDB6.0 开始,索引筛选器使用之前使用 命令设置的 排序规则 planCacheSetFilter

从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。

查询设置的功能比索引筛选器更多。 此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。 要添加查询设置并探索示例,请参阅setQuerySettings

提示

另请参阅:

后退

planCacheListFilters