查询结构
在版本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
命令的整体结构,它们支持比现有计划缓存查询结构更范围的查询结构。操作拒绝筛选器,用于区块具有指定查询结构结构的
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
阶段。要区块查询结构,请使用操作拒绝过滤。