文档菜单
文档首页
/
MongoDB 手册
/ / /

planCacheSetFilter

本页内容

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

设置集合的索引过滤器。如果针对 计划缓存查询形状 已经存在索引过滤器,则该命令将覆盖之前的索引过滤器。

新功能从版本8.0.

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

查询设置比索引过滤器功能更强大。此外,索引过滤器是不可持久化的,并且无法轻松为所有集群节点创建索引过滤器。要添加查询设置并查看示例,请参阅 setQuerySettings

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

这些设置适用于整个集群上的查询形状。集群在关闭后仍保留这些设置。

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

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

此命令在以下环境中部署的部署中可用

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

重要

此命令不支持M0、M2和M5集群。更多信息,请参阅不受支持的命令。

命令具有以下语法

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

索引过滤器查询形状是以下组合

  • 查询

  • 排序

  • 投影

  • 排序规则

命令具有以下字段

字段
类型
描述
planCacheSetFilter
string
索引过滤器的集合名称。
查询
document

索引过滤器的查询谓词。

仅使用谓词结构(包括字段名称)在索引过滤器中使用。查询谓词中的字段值不使用。因此,索引过滤器中的查询谓词用于与仅字段值不同的类似查询。

排序
document
可选。索引过滤器的排序。
投影
document
可选。索引过滤器的投影。
排序规则
document

指定操作中使用的排序规则

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

排序规则选项具有以下语法

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

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

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

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

您不能为操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者在进行带有排序的查找时,您不能为查找和排序使用不同的排序规则。

从 MongoDB 6.0 开始,索引过滤器使用之前通过 collation 设置的 collation,该 collation 是通过 planCacheSetFilter 命令设置的。

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

查询设置比索引过滤器功能更强大。此外,索引过滤器是不可持久化的,并且无法轻松为所有集群节点创建索引过滤器。要添加查询设置并查看示例,请参阅 setQuerySettings

索引
数组

一个用于指定计划缓存查询形状的索引过滤器的数组。

指定索引过滤器为以下数组之一

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

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

查询优化器使用集合扫描或索引数组进行查询计划。如果指定的索引不存在或被隐藏,优化器将使用集合扫描。

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

注释
任何

可选。用户提供的附加到此命令的注释。一旦设置,此注释将在以下位置的此命令记录旁边显示

注释可以是任何有效的 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是否会为计划缓存查询形状应用索引过滤器,请检查db.collection.explain()cursor.explain()方法中indexFilterSet字段。

以下示例为orders集合创建一个索引过滤器。该过滤器应用于谓词为对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 }的索引计划。

以下示例为orders集合创建一个索引过滤器。该过滤器应用于谓词为对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 }的索引计划。

从 MongoDB 6.0 开始,索引过滤器使用之前通过 collation 设置的 collation,该 collation 是通过 planCacheSetFilter 命令设置的。

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

查询设置比索引过滤器功能更强大。此外,索引过滤器是不可持久化的,并且无法轻松为所有集群节点创建索引过滤器。要添加查询设置并查看示例,请参阅 setQuerySettings

提示

另请参阅

返回

planCacheListFilters