On this page
planCacheSetFilter
在本页面
Definition
planCacheSetFilter
- 2.6 版的新功能。
为集合设置index filter。如果query shape已经存在索引过滤器,则该命令将覆盖先前的索引过滤器。
该命令具有以下语法:
db.runCommand(
{
planCacheSetFilter: <collection>,
query: <query>,
sort: <sort>,
projection: <projection>,
indexes: [ <index1>, <index2>, ...]
}
)
planCacheSetFilter命令具有以下字段:
Field | Type | Description |
---|---|---|
planCacheSetFilter |
string | 集合的名称。 |
query |
document | 与索引过滤器关联的查询谓词。 query 谓词与sort 和projection 一起构成指定索引过滤器的query shape。 |
仅谓词的结构(包括字段名)是重要的;查询谓词中的值无关紧要。因此,查询谓词涵盖仅值不同的类似查询。
| sort
|文档|可选。与过滤器关联的排序。 | sort
与query
和projection
一起构成指定索引过滤器的query shape。
| projection
|文档|可选。与过滤器关联的投影。 | projection
与query
和sort
一起构成指定索引过滤器的query shape。
| indexes
| array |指定query shape的索引过滤器数组。
将索引过滤器指定为以下任意一种:-索引规范文档的数组,例如[ { x : 1 }, ... ]
-一组索引名称,例如[ "x_1", ... ]
因为query optimizer在收集扫描和这些索引之间进行选择,所以如果索引不存在,优化器将选择收集扫描。
如果多个索引具有相同的键模式,则必须按名称指定索引。
索引过滤器仅在服务器进程期间存在,并且在关闭后不会持久;但是,您也可以使用planCacheClearFilters命令清除现有的索引过滤器。
Required Access
用户必须具有包括planCacheIndexFilter
操作的访问权限。
Examples
在仅包含谓词的查询形状上设置过滤器
下面的示例在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 }
的索引计划。
See also