planCacheSetFilter

在本页面

Definition

为集合设置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谓词与sortprojection一起构成指定索引过滤器的query shape


仅谓词的结构(包括字段名)是重要的;查询谓词中的值无关紧要。因此,查询谓词涵盖仅值不同的类似查询。
| sort |文档|可选。与过滤器关联的排序。 | sortqueryprojection一起构成指定索引过滤器的query shape
| projection |文档|可选。与过滤器关联的投影。 | projectionquerysort一起构成指定索引过滤器的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 }的索引计划。

首页