文档菜单
文档首页
/
MongoDB 手册
/ /

查询形状

本页内容

  • 示例
  • 行为
  • 开始使用
  • 了解更多

在版本中变更8.0.

查询形状是一组将相似查询组合在一起的规范。规范可以包括过滤器、排序、投影、聚合管道阶段、命名空间等。具有相似规范的查询具有相同的查询形状。

注意

从MongoDB 8.0版本开始,原有的查询形状被重命名为计划缓存查询形状,并且queryHash字段被重命名为planCacheShapeHash。有关区分计划缓存查询形状的命令组件,请参阅计划缓存查询形状的定义。MongoDB 8.0使用新的查询形状和本页所示的现有计划缓存查询形状。

在MongoDB 8.0和更早版本中,现有的计划缓存查询形状支持

  • 计划缓存场景下的查询规划。

  • 已弃用的索引过滤器。(从MongoDB 8.0版本开始,使用新查询形状的新查询设置。)

  • 聚合管道的一部分聚合管道。

从MongoDB 8.0版本开始,新的查询形状支持

  • 查询设置,您可以使用setQuerySettings添加。 (如本页稍后所示,查询设置指定了查询形状的索引和执行设置。)

  • $queryStats查询形状统计信息.

  • 计划缓存查询形状也支持的字段和操作。例如:filtersortprojection

  • 大多数用于finddistinctaggregate命令的字段和操作符。要查看命令的字段和操作符,请参阅每个命令页面上的语法部分。

  • findaggregationdistinct命令的整体结构,这些结构支持比现有计划缓存查询形状更广泛的查询形状。

  • 操作拒绝过滤器operation rejection filters以阻止具有指定查询形状的findaggregationdistinct命令。

  • 整个聚合管道。

从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 的 queryShapeHashplanCacheShapeHash 十六进制字符串,可以使用 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阶段。

  • 要阻止查询形状,请使用操作拒绝过滤器。

返回

查询计划