planCacheSetFilter
定义
查询设置
新功能从版本8.0.
从MongoDB 8.0开始,使用查询设置而不是添加 索引过滤器。索引过滤器从MongoDB 8.0开始已弃用。
查询设置比索引过滤器功能更强大。此外,索引过滤器是不可持久化的,并且无法轻松为所有集群节点创建索引过滤器。要添加查询设置并查看示例,请参阅 setQuerySettings
。
查询优化器在查询规划期间将查询设置作为附加输入使用,这会影响查询执行的计划。
这些设置适用于整个集群上的查询形状。集群在关闭后仍保留这些设置。
您可以添加find
、distinct
和aggregate
命令的查询设置。
要删除查询设置,请使用removeQuerySettings
。要获取查询设置,请在聚合管道中使用$querySettings
阶段。
兼容性
此命令在以下环境中部署的部署中可用
MongoDB Atlas:云中MongoDB部署的全托管服务
重要
此命令不支持M0、M2和M5集群。更多信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的、自管理的MongoDB版本
MongoDB Community:源可用的、免费使用且自管理的MongoDB版本
语法
命令具有以下语法
db.runCommand( { planCacheSetFilter: <collection>, query: <query>, sort: <sort>, projection: <projection>, collation: { <collation> }, indexes: [ <index1>, <index2>, ...], comment: <any> } )
索引过滤器查询形状是以下组合
查询
排序
投影
排序规则
命令字段
命令具有以下字段
字段 | 类型 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
planCacheSetFilter | string | 索引过滤器的集合名称。 | ||||||||||
查询 | document | 索引过滤器的查询谓词。 仅使用谓词结构(包括字段名称)在索引过滤器中使用。查询谓词中的字段值不使用。因此,索引过滤器中的查询谓词用于与仅字段值不同的类似查询。 | ||||||||||
排序 | document | 可选。索引过滤器的排序。 | ||||||||||
投影 | document | 可选。索引过滤器的投影。 | ||||||||||
排序规则 | document | 指定操作中使用的排序规则。 排序规则允许用户指定字符串比较的语言特定规则,例如字母大小写和重音符号的规则。 排序规则选项具有以下语法
指定排序规则时, 如果未指定排序规则,但集合具有默认排序规则(请参阅 如果未为集合或操作指定排序规则,MongoDB将使用先前版本中用于字符串比较的简单二进制比较。 您不能为操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者在进行带有排序的查找时,您不能为查找和排序使用不同的排序规则。 从 MongoDB 6.0 开始,索引过滤器使用之前通过 collation 设置的 collation,该 collation 是通过 从MongoDB 8.0开始,使用查询设置而不是添加 索引过滤器。索引过滤器从MongoDB 8.0开始已弃用。 查询设置比索引过滤器功能更强大。此外,索引过滤器是不可持久化的,并且无法轻松为所有集群节点创建索引过滤器。要添加查询设置并查看示例,请参阅 | ||||||||||
索引 | 数组 | 一个用于指定计划缓存查询形状的索引过滤器的数组。 指定索引过滤器为以下数组之一
查询优化器使用集合扫描或索引数组进行查询计划。如果指定的索引不存在或被隐藏,优化器将使用集合扫描。 对于具有相同键模式的多个索引,必须将索引指定为名称数组。 | ||||||||||
注释 | 任何 | 可选。用户提供的附加到此命令的注释。一旦设置,此注释将在以下位置的此命令记录旁边显示
注释可以是任何有效的 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
。