Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

查询结构

在此页面上

  • 示例
  • 行为
  • 开始体验
  • 了解详情

在版本8.0中进行了更改

查询结构是将类似查询群组在一起的一设立规范。 规范可以包括筛选器、排序、投影、聚合管道阶段、命名空间等。 具有相似规范的查询具有相同的查询结构。

注意

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

在MongoDB 8.0及更早版本中,现有计划缓存查询结构支持:

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

  • 已弃用索引筛选器。 (从MongoDB 8.0开始,对新查询结构使用新查询设置。)

  • 聚合管道的子集。

从MongoDB 8.0开始,新的查询结构支持:

  • 查询设置,可以使用setQuerySettings添加。 (您将在本页后面看到,查询设置指定查询结构的索引和执行设置。)

  • $queryStats查询结构统计信息。

  • 计划缓存查询结构也支持的字段和操作。 示例: filtersortprojection

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

  • findaggregationdistinct命令的整体结构,它们支持比现有计划缓存查询结构更范围的查询结构。

  • 操作拒绝筛选器,用于区块具有指定查询结构结构的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输出具有与上一示例不同的queryShapeHashplanCacheShapeHash 。 示例:

queryShapeHash: 'AC1ECADBE8F1EB0F417A30741AB4813BE7E0BFEF523B0870CA11FCBC87F1A8B2'
planCacheShapeHash: '31A52130'

从MongoDB 8.0开始,为查询结构添加查询设置,而不是为集合添加索引筛选器。 从MongoDB 8.0开始,索引筛选器已弃用。 查询设置的功能比索引筛选器更多,并且索引筛选器在集群关闭后不会持续存在。

查询设置允许您对集群中查询结构的所有执行使用索引。 此外,为防止操作导致集群工作负载过大,您可以使用操作拒绝过滤拒绝与查询结构关联的所有操作。

在查询规划期间,查询优化器使用查询设置作为附加输入。 查询设置会影响为运行具有匹配查询结构的查询而选择的计划。

后退

查询计划