Overview
En esta guía, aprenderá a usar el controlador de Rust para ejecutar un comando de base de datos. Puede usar comandos de base de datos para realizar diversas tareas administrativas y de diagnóstico, como obtener estadísticas del servidor, inicializar un conjunto de réplicas o ejecutar una canalización de agregación.
Esta guía incluye las siguientes secciones:
Ejecutar un comando describe la sintaxis y el comportamiento del comando.
run_command()y métodosrun_cursor_command()La respuesta describe la información que devuelven los métodos de ejecución del comando.
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 API para los tipos y métodos mencionados en esta guía.
Importante
Prefiera los métodos del controlador a los comandos de base de datos
El controlador proporciona métodos de encapsulamiento para numerosos comandos de base de datos. Recomendamos usar métodos de controlador en lugar de ejecutar comandos de base de datos siempre que sea posible.
Para realizar tareas administrativas, utilice MongoDB Shell en lugar del controlador de Rust. Llamar al db.runCommand() método dentro del shell es la mejor manera de ejecutar comandos de base de datos, ya que proporciona una interfaz consistente entre el shell y los controladores.
Ejecutar un comando
Para ejecutar un comando de base de datos, debe especificar el comando y los parámetros relevantes en un documento de comando y, a continuación, pasar dicho documento a un método de ejecución. 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(), que devuelve la respuesta del comando como un tipo iterableCursor. Este método solo se puede usar si el comando de base de datos devuelve varios documentos de resultados.
El siguiente código muestra cómo puede utilizar el método run_command() para ejecutar el comando hello, que devuelve información sobre el rol del miembro actual en el conjunto 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 siguen la preferencia de lectura que podrías haber establecido en tu objeto Database en otra parte del código. De forma predeterminada, utilizan la preferencia de lectura primary.
Puede establecer 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 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(), utilice la misma sintaxis que en el ejemplo anterior.
Para obtener más información sobre las opciones de preferencia de lectura, consulte 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 tras la ejecución del comando. El método run_cursor_command() devuelve un objeto Cursor que hace referencia a varios documentos de resultados.
Cada comando de base de datos realiza una función diferente, por lo que el contenido de la respuesta puede variar según el 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, |
| Si el comando tuvo é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 publicación de blog sobre el Reloj Lógico Global. |
| Un documento que contiene la hora de clúster firmada. La hora de clúster es una hora lógica utilizada para ordenar las 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 (el plan seleccionado por el optimizador de consultas) y los planes rechazados. 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, consulte la siguiente documentación en el manual del servidor: