查询形状
在版本中变更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阶段。要阻止查询形状,请使用操作拒绝过滤器。