查询形状
在版本中变更8.0.
查询形状是一组将相似查询组合在一起的规范。规范可以包括过滤器、排序、投影、聚合管道阶段、命名空间等。具有相似规范的查询具有相同的查询形状。
注意
从MongoDB 8.0版本开始,原有的查询形状被重命名为计划缓存查询形状,并且queryHash
字段被重命名为planCacheShapeHash
。有关区分计划缓存查询形状的命令组件,请参阅计划缓存查询形状的定义。MongoDB 8.0使用新的查询形状和本页所示的现有计划缓存查询形状。
在MongoDB 8.0和更早版本中,现有的计划缓存查询形状支持
从MongoDB 8.0版本开始,新的查询形状支持
查询设置,您可以使用
setQuerySettings
添加。 (如本页稍后所示,查询设置指定了查询形状的索引和执行设置。)计划缓存查询形状也支持的字段和操作。例如:
filter
、sort
和projection
。大多数用于
find
、distinct
和aggregate
命令的字段和操作符。要查看命令的字段和操作符,请参阅每个命令页面上的语法部分。find
、aggregation
和distinct
命令的整体结构,这些结构支持比现有计划缓存查询形状更广泛的查询形状。操作拒绝过滤器operation rejection filters以阻止具有指定查询形状的
find
、aggregation
和distinct
命令。整个聚合管道。
从MongoDB 8.0版本开始,您可以使用$querySettings
管道阶段来返回为每个查询形状指定的查询设置。
示例
以下部分展示了针对以下示例 pizzaOrders
集合的查询形状示例
db.pizzaOrders.insertMany( [ { _id: 0, type: "pepperoni", size: "small", price: 19, totalNumber: 10, orderDate: ISODate( "2023-03-13T08:14:30Z" ) }, { _id: 1, type: "pepperoni", size: "medium", price: 20, totalNumber: 20, orderDate: ISODate( "2023-03-13T09:13:24Z" ) }, { _id: 2, type: "pepperoni", size: "large", price: 21, totalNumber: 30, orderDate: ISODate( "2023-03-17T09:22:12Z" ) }, { _id: 3, type: "cheese", size: "small", price: 12, totalNumber: 15, orderDate: ISODate( "2023-03-13T11:21:39.736Z" ) } ] )
匹配查询形状
以下示例查询形状显示了在默认 test
数据库中针对 pizzaOrders
集合的 find
命令的规范
find: "pizzaOrders", filter: { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } }, sort: { totalNumber: 1 }, $db: "test"
该示例过滤器将文档限制在订单日期大于指定日期的文档。示例按照订购的披萨总数进行升序排序。
要查看 MongoDB 8.0 的 queryShapeHash
和 planCacheShapeHash
十六进制字符串,可以使用 explain
命令。
以下 explain
示例包含具有相同查询形状的查询
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2024-05-10T05:15:35Z" ) } } ). sort( { totalNumber: 1 } ) db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2024-02-05T07:07:16Z" ) } } ). sort( { totalNumber: 1 } ) db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-03-08T08:12:25Z" ) } } ). sort( { totalNumber: 1 } )
由于查询形状相同,explain
输出的每个示例都具有相同的 queryShapeHash
,并且每个都具有相同的 planCacheShapeHash
。例如
queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1' planCacheShapeHash: '48E51110'
不同查询形状
如果查询具有不同的规范,则查询具有不同的形状。例如,如果查询具有不同的过滤器、排序、投影、命名空间或聚合管道阶段。
在上一节中的示例中,示例按照 totalNumber
字段进行排序。如果您将查询排序从 totalNumber
更改为不同的字段,则查询具有不同的查询形状。
例如,按披萨 price
排序会更改查询形状
db.pizzaOrders.explain().find( { orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ). sort( { price: 1 } )
由于查询形状与上一节的形状不同,explain
输出的 queryShapeHash
与前一个示例不同,并且 planCacheShapeHash
也不同。例如
queryShapeHash: 'AC1ECADBE8F1EB0F417A30741AB4813BE7E0BFEF523B0870CA11FCBC87F1A8B2' planCacheShapeHash: '31A52130'
行为
从MongoDB 8.0开始,为查询形状添加查询设置而不是索引过滤器。从MongoDB 8.0开始,索引过滤器已被弃用。查询设置比索引过滤器具有更多功能,并且在集群关闭后,索引过滤器不会持久化。
查询设置允许您在集群中对查询形状的所有查询执行使用索引。此外,为了防止操作导致集群负载过高,您可以使用操作拒绝过滤器拒绝与查询形状关联的所有操作。
查询优化器在查询计划过程中将查询设置作为额外的输入。查询设置会影响选择运行的具有匹配查询形状的查询的计划。
入门
要为查询形状添加查询设置,请使用
setQuerySettings
。要删除查询设置,请使用
removeQuerySettings
。要检索查询设置,请使用聚合管道中的
$querySettings
阶段。要阻止查询形状,请使用操作拒绝过滤器。