Overview
En esta guía, puedes aprender a utilizar el controlador de Rust para ejecutar un comando de base de datos. Puedes utilizar comandos de base de datos para realizar una variedad de tareas administrativas y de diagnóstico, como obtener estadísticas del servidor, inicializar un set de réplicas o ejecutar una pipeline de agregación.
Esta guía incluye las siguientes secciones:
Ejecutar un Comando describe la sintaxis y el comportamiento de la
run_command()yrun_cursor_command()métodosRespuesta describe la información que devuelven los métodos de ejecución de comandos
Ejemplo de comando proporciona un ejemplo de comando y describe la salida del comando
Información adicional proporciona enlaces a recursos y documentación de la API para los tipos y métodos mencionados en esta guía
Importante
Prefiere los métodos del controlador a los comandos de base de datos
El driver proporciona métodos contenedores para muchos comandos de base de datos. Recomendamos usar métodos de driver en vez de ejecutar comandos de base de datos cuando sea posible.
Para realizar tareas administrativas, utiliza el MongoDB Shell en lugar del controlador de Rust. Llamar al método db.runCommand() dentro del shell es la manera preferida de emitir un comando de base de datos, ya que proporciona una interfaz coherente entre el shell y los drivers.
Ejecutar un comando
Para ejecutar un comando de base de datos, debes especificar el comando y cualquier parámetro relevante en un documento de comando, luego pasar el documento de comando a un método de ejecución de comandos. El controlador de Rust proporciona los siguientes métodos para ejecutar comandos de base de datos:
run_command(), que devuelve la respuesta del comando como un tipoDocument. Puedes utilizar este método con cualquier comando de base de datos.run_cursor_command()Devolviendo la respuesta del comando como un tipo iterableCursor. Sólo puedes utilizar este método si tu comando de base de datos devuelve varios documentos de resultados.
El siguiente código muestra cómo se puede utilizar el método run_command() para ejecutar el comando hello, el cual genera información sobre el rol actual del nodo en el set de réplicas, en una base de datos:
let result = my_db.run_command(doc! { "hello": 1 }).await?;
El comando checkMetadataConsistency devuelve múltiples documentos de resultados. Puedes utilizar el método run_cursor_command() para ejecutar este comando y recopilar los resultados, como se muestra en el siguiente código:
let cursor = my_db .run_cursor_command(doc! { "checkMetadataConsistency": 1 }) .await?;
Para encontrar un enlace a una lista completa de comandos de bases de datos y parámetros correspondientes, consulta la sección Información adicional.
Nota
preferencia de lectura
Los métodos run_command() y run_cursor_command() no respetan la preferencia de lectura que podría haber establecido en su objeto Database en otro lugar de su código. Por defecto, utilizan la preferencia de lectura primary.
Puedes configurar una preferencia de lectura para la ejecución de comandos encadenando el método selection_criteria() a run_command() o run_cursor_command(). El siguiente código muestra cómo especificar una preferencia de lectura en una instancia de SelectionCriteria y pasarla como parámetro al método selection_criteria():
let result = my_db .run_command(doc! { "hello": 1 }) .selection_criteria(SelectionCriteria::ReadPreference(ReadPreference::Primary)) .await?;
Para establecer una preferencia de lectura para el método run_cursor_command(), utiliza la misma sintaxis que en el ejemplo anterior.
Para obtener más información sobre las opciones de preferencia de lectura, consulta Preferencia de lectura en el Manual del servidor.
Respuesta
El método run_command() devuelve un objeto Document que contiene la respuesta de la base de datos después de que se haya ejecutado el comando. El run_cursor_command() devuelve un Cursor que referencia múltiples documentos de resultados.
Cada comando de base de datos realiza una función diferente, por lo que el contenido de la respuesta puede variar dependiendo del comando ejecutado. Sin embargo, cada respuesta contiene un documento con los siguientes campos:
Campo | Descripción |
|---|---|
<command result> | Campos específicos del comando de base de datos. Por ejemplo, |
| Indica si el comando ha tenido éxito ( |
| El tiempo lógico de la operación. MongoDB utiliza el tiempo lógico para ordenar las operaciones. Para obtener más información sobre el tiempo lógico, consulte nuestra entrada de blogsobre el reloj lógico global. |
| Un documento que contiene la hora del clúster firmada. El tiempo de clúster es un tiempo lógico utilizado para el ordenamiento de operaciones. Este documento contiene los siguientes campos:
|
Ejemplo de comando
El siguiente código muestra cómo puedes utilizar el método run_command() para ejecutar el comando explain para una operación count en la colección flowers de la base de datos plants. El comando explain se ejecuta en el modo de verbosidad "queryPlanner":
let my_db = client.database("plants"); let count_command = doc! { "count": "flowers" }; let explain_command = doc! { "explain": count_command, "verbosity": "queryPlanner" }; let result = my_db.run_command(explain_command).await?;
Salida
La salida incluye campos que explican la ejecución de la operación count, como el plan ganador, que es el plan seleccionado por el optimizador del query, y cualquier plan rechazado. La salida también contiene información sobre la ejecución del comando explain:
{ "$clusterTime": { "clusterTime": { "T": 1673969525, "I": 24 }, "signature": {...} }, "command": { "$db": "plants", "count": "flowers" }, "explainVersion": "1", "ok": 1, "operationTime": { "T": 1673969525, "I": 24 }, "queryPlanner": { "indexFilterSet": false, "maxIndexedAndSolutionsReached": false, "maxIndexedOrSolutionsReached": false, "maxScansToExplodeReached": false, "namespace": "plants.flowers", "rejectedPlans": [], "winningPlan": { "stage": "RECORD_STORE_FAST_COUNT" } }, "serverInfo": {...}, "serverParameters": { "internalDocumentSourceGroupMaxMemoryBytes": 104857600, ... } }
Información Adicional
Para obtener más información sobre los conceptos de esta guía, consulta la siguiente documentación en el manual del servidor: