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 de consulta preexistente se renombra como forma de consulta de caché de plan y la 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 laforma de consulta de la caché de planes. MongoDB 8.0 utiliza la nueva forma de consulta y la forma de consulta 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).los campos y operaciones también admitidos por la forma del query de la caché del plan. Ejemplos:
filter,sort, yprojection.La mayoría de los campos y operandos disponibles para los comandos, y. Para ver los campos y operandos de los comandos, consulte las secciones de Sintaxis en cada página de
finddistinctaggregatecomando.la estructura general de los comandos
find,aggregationydistinct, 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,aggregationydistinctque tengan una forma del query especificada.Todo el proceso de agregación.
A partir de MongoDB 8.0, puedes usar una etapa $querySettings de pipeline para devolver configuraciones de query especificadas para cada forma del query.
Ejemplos
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" ) } ] )
Forma del query coincidente
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 } )
Dado que las formas de consulta son las mismas, 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'
forma del query diferente
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'
Comportamiento
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.
La configuración de consultas permite usar un índice para todas las ejecuciones de una forma de consulta en un clúster. Además, para evitar que una operación genere una carga de trabajo excesiva en el clúster, se pueden rechazar todas las operaciones asociadas a una forma de consulta mediante 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.
Empezar
Para agregar la configuración de query para una forma del query, use
setQuerySettings.Para eliminar la configuración de la consulta,
removeQuerySettingsutilice.Para recuperar la configuración del query, utiliza una etapa
$querySettingsen una pipeline de agregación.Para bloquear una forma de consulta, utilice un filtro de rechazo de operación.