对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

查询结构

在版本8.0中进行了更改。

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

注意

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

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

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

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

  • 计划缓存查询结构也支持的字段和操作。 示例: 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开始,索引筛选器已弃用。 查询设置的功能比索引筛选器更多,并且索引筛选器在集群关闭后不会持续存在。

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

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

MongoDB derives the queryShapeHash from the query shape itself, not from the deployment that runs the query. In current supported versions, the same query shape is expected to produce the same queryShapeHash:

  • 在部署中的每个节点上。

  • 在副本集和分片集群上。

在跨集群、跨MongoDB版本或迁移后重复使用哈希之前,请验证哈希是否仍然匹配。

您可以应用相同的查询设置应用于部署中每个节点上的查询结构。在迁移(例如从副本集到分片集群)或在其他集群上迁移后,在依赖由查询结构哈希指定的查询设置之前,请验证哈希在目标部署中是否仍然匹配。

获得技能徽章

免费掌握“查询优化”!

了解详情

给本页内容打分