Consultas en Amazon DocumentDB - Amazon DocumentDB

Consultas en Amazon DocumentDB

En esta sección se explican todos los aspectos de las consultas con Amazon DocumentDB.

Consulta de documentos

A veces, es posible que tenga que examinar el inventario de su tienda online para que los clientes puedan ver y comprar lo que usted vende. Consultar una colección es relativamente fácil, tanto si desea consultar todos los documentos de la colección como solo aquellos que cumplan un determinado criterio.

Para consultar documentos, utilice la operación find(). El comando find() tiene un único parámetro de documento que define los criterios que se utilizan al elegir los documentos que se devuelven. El resultado de find() es un documento formateado como una sola línea de texto sin saltos de línea. Para formatear el documento resultante para facilitar su lectura, utilice find().pretty(). En todos los ejemplos que se muestran en este tema, se utiliza .pretty() para formatear la salida.

Los siguientes ejemplos de código utilizan los cuatro documentos que insertó en la colección example en los dos ejercicios anteriores: insertOne() y insertMany() que se encuentran en la sección sobre cómo agregar documentos de Trabajar con documentos.

Recuperar todos los documentos de una colección

Para recuperar todos los documentos de la colección, utilice la operación find() con un documento de consulta vacío.

La siguiente consulta devuelve todos los documentos de la colección example.

db.example.find( {} ).pretty()

Recuperación de documentos que coincidan con un valor de campo

Para recuperar todos los documentos que coincidan con un campo y valor, utilice la operación find() con un documento de consulta que identifique los campos y valores que desee.

Si se utilizan los documentos anteriores, esta consulta devuelve todos los documentos cuyo campo "Item" contiene "Pen".

db.example.find( { "Item": "Pen" } ).pretty()

Recuperación de documentos que coincidan con un documento incrustado

Para buscar todos los documentos que coinciden con un documento incrustado, utilice la operación find() con un documento de consulta que especifique el nombre del documento incrustado y todos los campos y los valores de ese documento incrustado.

Cuando se buscan coincidencias con un documento incrustado, el documento incrustado del documento debe tener el mismo nombre que en la consulta. Además, los campos y los valores del documento incrustado deben coincidir con la consulta.

La siguiente consulta devuelve únicamente el documento "Poster Paint". Esto se debe a que "Pen" tiene diferentes valores para "MinOnHand" y "OnHand", y "Spray Paint" tiene un campo más (OrderQnty) que el documento de consulta.

db.example.find({"Inventory": { "OnHand": 47, "MinOnHand": 50 } } ).pretty()

Recuperación de documentos que coincidan con un valor de campo de un documento incrustado

Para buscar todos los documentos que coinciden con un documento incrustado, utilice la operación find() con un documento de consulta que especifique el nombre del documento incrustado y todos los campos y los valores de ese documento incrustado.

Dados los documentos anteriores, la siguiente consulta utiliza la "notación de puntos" para especificar el documento incrustado y los campos de interés. Se devolverá cualquier documento que coincida con ellos, independientemente de los otros campos que puedan existir en el documento incrustado. La consulta devuelve "Poster Paint" y "Spray Paint", ya que ambos coinciden con los campos y los valores especificados.

db.example.find({"Inventory.OnHand": 47, "Inventory.MinOnHand": 50 }).pretty()

Recuperación de documentos que coincidan con una matriz

Para buscar todos los documentos que coincidan con una matriz, utilice la operación find() con el nombre de la matriz que le interese y todos los valores de esa matriz. La consulta devuelve todos los documentos que tengan una matriz con ese nombre y cuyos valores de la matriz sean idénticos y estén en el mismo orden que en la consulta.

La siguiente consulta devuelve únicamente "Pen", ya que "Poster Paint" tiene un color adicional (White) y "Spray Paint" tiene los colores en otro orden.

db.example.find( { "Colors": ["Red","Green","Blue","Black"] } ).pretty()

Recuperación de documentos que coincidan con un valor de una matriz

Para buscar todos los documentos que tengan un valor determinado en una matriz, utilice la operación find() con el nombre de la matriz y el valor que le interese.

db.example.find( { "Colors": "Red" } ).pretty()

La operación anterior devuelve los tres documentos, ya que cada uno de ellos tiene una matriz denominada Colors y el valor "Red" en algún lugar de la matriz. Si especifica el valor "White", la consulta solo devolvería "Poster Paint".

Recuperación de documentos mediante operadores

La siguiente consulta devuelve todos los documentos en los que el valor de "Inventory.OnHand" es menor que 50.

db.example.find( { "Inventory.OnHand": { $lt: 50 } } )

Para obtener una lista de los operadores de consulta admitidos, consulte Operadores de consulta y proyección.

Plan de consulta

¿Cómo puedo ver executionStats para un plan de consultas?

Al determinar por qué una consulta se está ejecutando más lentamente de lo esperado, puede ser útil comprender qué executionStats son para el plan de consulta. executionStats proporciona el número de documentos devueltos desde una etapa determinada (nReturned), la cantidad de tiempo de ejecución empleado en cada etapa (executionTimeMillisEstimate) y la cantidad de tiempo que tarda en generar un plan de consulta (planningTimeMillis). Puede determinar las etapas más exigentes de su consulta para ayudar a enfocar sus esfuerzos de optimización a partir de la salida de executionStats, como se muestra en los ejemplos de consulta a continuación. El parámetro executionStats actualmente no admite comandos update ni delete.

nota

Amazon DocumentDB emula la API MongoDB 3.6 en un motor de base de datos personalizada específicamente que utiliza un sistema de almacenamiento distribuido, tolerante a fallos y de recuperación automática. Como resultado, los planes de consulta y la salida de explain() pueden diferir entre Amazon DocumentDB y MongoDB. Los clientes que deseen controlar su plan de consulta pueden utilizar el operador $hint para aplicar la selección de un índice preferido.

Ejecute la consulta que desee mejorarse en el comando explain() del modo siguiente.

db.runCommand({explain: {query document}}). explain("executionStats").executionStats;

A continuación se muestra un ejemplo de operación.

db.fish.find({}).limit(2).explain("executionStats");

La salida de esta operación será similar a lo que se indica a continuación.

{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.fish", "winningPlan" : { "stage" : "SUBSCAN", "inputStage" : { "stage" : "LIMIT_SKIP", "inputStage" : { "stage" : "COLLSCAN" } } } }, "executionStats" : { "executionSuccess" : true, "executionTimeMillis" : "0.063", "planningTimeMillis" : "0.040", "executionStages" : { "stage" : "SUBSCAN", "nReturned" : "2", "executionTimeMillisEstimate" : "0.012", "inputStage" : { "stage" : "LIMIT_SKIP", "nReturned" : "2", "executionTimeMillisEstimate" : "0.005", "inputStage" : { "stage" : "COLLSCAN", "nReturned" : "2", "executionTimeMillisEstimate" : "0.005" } } } }, "serverInfo" : { "host" : "enginedemo", "port" : 27017, "version" : "3.6.0" }, "ok" : 1 }

Si está interesado en ver sólo el executionStats de la consulta anterior, puede utilizar el siguiente comando. En colecciones pequeñas, el procesador de consultas de Amazon DocumentDB puede optar por no utilizar un índice si las ventajas para el rendimiento son insignificantes.

db.fish.find({}).limit(2).explain("executionStats").executionStats;

Memoria caché de planes de consultas

Para optimizar el rendimiento y reducir la duración de la planificación, Amazon DocumentDB almacena internamente en caché los planes de consultas. Esto permite que las consultas con la misma forma se ejecuten directamente mediante un plan en caché.

Sin embargo, este almacenamiento en caché a veces puede provocar un retraso aleatorio para la misma consulta; por ejemplo, una consulta que normalmente tarda un segundo en ejecutarse puede tardar en ocasiones diez segundos. Esto se debe a que, con el tiempo, la instancia del lector almacenó en caché varias formas de la consulta, lo que consumió memoria. Si experimenta esta lentitud aleatoria, no es necesario que realice ninguna acción para liberar la memoria: el sistema gestionará el uso de la memoria por usted y, una vez que la memoria alcance un determinado umbral, se liberará automáticamente.

Descripción de los resultados

Si desea devolver información sobre los planes de consultas, Amazon DocumentDB admite el modo verbosidad queryPlanner. Los resultados explain devuelven el plan de consultas seleccionado elegido por el optimizador en un formato similar al siguiente:

{ "queryPlanner" : { "plannerVersion" : <int>, "namespace" : <string>, "winningPlan" : { "stage" : <STAGE1>, ... "inputStage" : { "stage" : <STAGE2>, ... "inputStage" : { ... } } } } }

En las siguientes secciones se definirán los resultados explain comunes.

Etapa de escaneo y filtrado

El optimizador puede elegir uno de los siguientes escaneos:

COLLSCAN

Esta etapa es un escaneo secuencial de la colección.

{ "stage" : "COLLSCAN" }

IXSCAN

Esta etapa escanea las claves de índice. El optimizador puede recuperar el documento en esta etapa y esto puede provocar que se añada una etapa FETCH más adelante.

db.foo.find({"a": 1}) { "stage" : "IXSCAN", "direction" : "forward", "indexName" : <idx_name> }

FETCH

Si el optimizador recuperó documentos en una etapa distinta de IXSCAN, el resultado incluirá una etapa FETCH. Por ejemplo, la consulta IXSCAN anterior puede resultar en una combinación de las etapas FETCH e IXSCAN:

db.foo.find({"a": 1}) { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "indexName" : <idx_name> } }

IXONLYSCAN escanea solo la clave de índice. Crear índices compuestos no evitará FETCH.

Intersección de índices

IXAND

Amazon DocumentDB puede incluir una etapa IXAND con una matriz InputStages de IXSCAN si puede utilizar la intersección de índices. Por ejemplo, podemos ver un resultado como el siguiente:

{ "stage" : "FETCH", "inputStage" : { "stage" : "IXAND", "inputStages" : [ { "stage" : "IXSCAN", "indexName" : "a_1" }, { "stage" : "IXSCAN", "indexName" : "b_1" } ] } }

Unión de índices

MIXOR

De forma similar a la intersección de índices, Amazon DocumentDB puede incluir una etapa IXOR con una matriz inputStages para el operador $or.

db.foo.find({"$or": [{"a": {"$gt": 2}}, {"b": {"$lt": 2}}]})

Para la consulta anterior, el resultado de la explicación podría tener este aspecto:

{ "stage" : "FETCH", "inputStage" : { "stage" : "IXOR", "inputStages" : [ { "stage" : "IXSCAN", "indexName" : "a_1" }, { "stage" : "IXSCAN", "indexName" : "b_1" } ] } }

Intersección/unión de índices múltiples

Amazon DocumentDB puede combinar varias etapas de unión o intersección de índices y, a continuación, obtener el resultado. Por ejemplo:

{ "stage" : "FETCH", "inputStage" : { "stage" : "IXOR", "inputStages" : [ { "stage" : "IXSCAN", ... }, { "stage" : "IXAND", "inputStages" : [ { "stage" : "IXSCAN", ... }, { "stage" : "IXSCAN", ... } ] } ] } }

El uso de las etapas de intersección o unión del índice no se ve afectado por el tipo de índice (escaso, compuesto, etc.).

Índice compuesto

El uso del índice compuesto de Amazon DocumentDB no está limitado a los subconjuntos iniciales de los campos indexados; puede utilizar el índice con la parte del sufijo, pero puede que no sea muy eficaz.

Por ejemplo, el índice compuesto de { a: 1, b: -1 } puede admitir las tres consultas siguientes:

db.orders.find( { a: 1 } } )

db.orders.find( { b: 1 } } )

db.orders.find( { a: 1, b: 1 } } )

Etapa de clasificación

Si hay un índice en las claves de clasificación solicitadas, Amazon DocumentDB puede usar el índice para obtener la clasificación. En ese caso, el resultado no incluirá una etapa SORT, sino más bien una etapa IXSCAN. Si el optimizador prefiere una ordenación simple, incluirá una etapa como esta:

{ "stage" : "SORT", "sortPattern" : { "a" : 1, "b" : -1 } }

Etapa de grupos

Amazon DocumentDB admite dos estrategias de grupo diferentes:

  • SORT_AGGREGATE: agregado de clasificación en disco.

  • HASH_AGGREGATE: agregado de hash en memoria.