planCacheSetFilter
定义
查询设置
8.0版本新增。
从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。
查询设置的功能比索引筛选器更多。 此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。 要添加查询设置并探索示例,请参阅setQuerySettings
。
在查询规划期间,查询优化器使用查询设置作为附加输入,这样会影响为运行查询而选择的计划。
这些设置将应用于整个集群上的查询结构。在关闭之后,集群将保留这些设置。
您可以为 find
、distinct
和 aggregate
命令添加查询设置。
要删除查询设置,请使用 removeQuerySettings
。要获取查询设置,请在一个聚合管道中使用一个 $querySettings
阶段。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 0 、M 2和 M 5集群不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
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 | 文档 | 指定用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。 排序规则选项的语法如下:
指定排序规则时, 如果未指定排序规则,但集合具有默认排序规则(请参阅 如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。 从 MongoDB6.0 开始,索引筛选器使用之前使用 命令设置的 排序规则 从 MongoDB 8.0开始,使用查询设置而不是添加索引筛选器。 从 MongoDB 8.0开始,索引筛选器已弃用。 查询设置的功能比索引筛选器更多。 此外,索引筛选器不是持久性的,您无法轻松地为所有集群节点创建索引筛选器。 要添加查询设置并探索示例,请参阅 | ||||||||||
indexes | 阵列 | |||||||||||
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()
方法的 字段。
对由谓词、投影和排序组成的计划缓存查询结构设置筛选器
以下示例为orders
collection创建了一个索引筛选器。该筛选器适用于其谓词为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
collection创建了一个索引筛选器。该筛选器适用于其谓词为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
。