Docs Menu
Docs Home
/ /

Formas del query

Cambiado en la versión 8.0.

Una forma del query es un conjunto de especificaciones que agrupan queries similares. Las especificaciones pueden incluir filtros, ordenamientos, proyecciones, etapas del pipeline de agregación, un espacio de nombres y otros. Los queries que tienen especificaciones similares tienen la misma forma del query.

Nota

A partir de MongoDB 8.0, la forma del query preexistente se renombra como forma del query de caché de planes, y el queryHash el campo se renombra como planCacheShapeHash. Para conocer los componentes de un comando que diferencian las formas de consulta de la caché del plan, consulta la Definición de forma del query de caché de plan. MongoDB 8.0 utiliza la nueva forma del query y la forma del query de la caché de planes existente, como se muestra en esta página.

En MongoDB 8.0 y versiones anteriores, la forma del query de la caché de planes existente admite:

  • planificación de consultas en escenarios de caché de planes.

  • filtros de índice obsoletos. (A partir de MongoDB 8.0, utiliza la nueva configuración de queries para la nueva forma del query).

  • un subconjunto de la pipeline de agregación.

A partir de MongoDB 8.0, la nueva forma del query admite:

  • query settings, que puedes agregar con setQuerySettings. (Como verás más adelante en esta página, la configuración del query especifica los índices y la configuración de ejecución para una forma del query).

  • $queryStats estadísticas de la forma del query.

  • los campos y operaciones también admitidos por la forma del query de la caché del plan. Ejemplos: filter, sort, y projection.

  • la mayoría de los campos y operandos están disponibles para los comandos find, distinct y aggregate. Para ver los campos y operandos de los comandos, consulta las secciones de Sintaxis en cada página de comando.

  • la estructura general de los comandos find, aggregation y distinct, los cuales admiten un rango más amplio de formas del query que la forma del query de la caché de planes existente.

  • filtros de rechazo de operación para bloquear los comandos find, aggregation y distinct que tengan una forma del query especificada.

  • el pipeline de agregación completo.

A partir de MongoDB 8.0, puedes usar una etapa $querySettings de pipeline para devolver configuraciones de query especificadas para cada forma del query.

Las siguientes secciones muestran ejemplos con formas del query para la siguiente colección de ejemplos 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" ) }
] )

El siguiente ejemplo de forma del query muestra las especificaciones de un comando find en la colección pizzaOrders de la base de datos test por defecto:

find: "pizzaOrders",
filter: {
orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) }
},
sort: {
totalNumber: 1
},
$db: "test"

El filtro de ejemplo limita los documentos a aquellos con una fecha de pedido posterior a la fecha especificada. El ejemplo tiene un orden ascendente en el número total de pizzas ordenadas.

Para ver los queryShapeHash y planCacheShapeHash strings hexadecimales de MongoDB 8.0, puedes usar el comando explain.

Los siguientes explain ejemplos contienen queries con la misma forma del query:

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 }
)

Debido a que la forma del query es la misma, la salida explain tiene el mismo queryShapeHash para cada uno de los ejemplos, y el mismo planCacheShapeHash para cada uno. Por ejemplo:

queryShapeHash: 'AB8ECADEE8F0EB0F447A30744EB4813AE7E0BFEF523B0870CA10FCBC87F5D8F1'
planCacheShapeHash: '48E51110'

Una query tiene una forma diferente si la query tiene especificaciones diferentes. Por ejemplo, si una query tiene un filtro diferente, orden, proyección, namespace, u etapas de pipeline de agregación.

En el ejemplo de la sección anterior, el ejemplo ordena por el campo totalNumber. Si cambia el orden de la consulta de totalNumber a otro campo, la consulta tiene una forma del query diferente.

Por ejemplo, ordenar por pizza price cambia la forma del query:

db.pizzaOrders.explain().find(
{ orderDate: { $gt: ISODate( "2023-01-20T00:00:00Z" ) } } ).
sort( { price: 1 }
)

Debido a que la forma del query es diferente de la forma en la sección anterior, la salida explain tiene un queryShapeHash diferente del ejemplo anterior y un planCacheShapeHash diferente. Por ejemplo:

queryShapeHash: 'AC1ECADBE8F1EB0F417A30741AB4813BE7E0BFEF523B0870CA11FCBC87F1A8B2'
planCacheShapeHash: '31A52130'

A partir de MongoDB 8.0, agregar configuraciones de consulta para forma del query en lugar de filtros de índice para colecciones. Los filtros de índices se han desaprobado a partir de MongoDB 8.0. Los ajustes de query tienen más funcionalidades que los filtros de índice, y los filtros de índice no son persistentes después de un apagado del clúster.

Los parámetros de query permiten utilizar un índice para todas las ejecuciones de una forma del query en un clúster. Además, para evitar que una operación provoque una carga de trabajo excesiva en el clúster, puedes rechazar todas las operaciones asociadas con una forma del query utilizando un filtro de rechazo de operaciones.

El optimizador del query utiliza la configuración de la query como una entrada adicional durante la planificación de la query. La configuración de query afecta el plan seleccionado para ejecutar un query que tenga una forma del query coincidente.

Volver

Planes de query

Obtén una insignia de habilidad

¡Domina "Query Optimization" gratis!

Más información

En esta página