Overview
En esta guía, puedes aprender a ejecutar un comando de base de datos con el controlador Go. 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.
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 contenedor. El documento de comando debe ser de un tipo que preserve el orden, como bson.D. El controlador de Go proporciona los siguientes métodos para ejecutar comandos de base de datos:
RunCommand(), que devuelve la respuesta del comando como un tipoSingleResult. Puedes utilizar este método con cualquier comando de base de datos.RunCommandCursor()que devuelve la respuesta del comando como un tipoCursor. Puede utilizar este método si su comando de base de datos devuelve múltiples documentos de resultados.
El siguiente código muestra cómo se puede utilizar el método RunCommand() 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:
command := bson.D{{"hello", 1}} var result bson.M err = db.RunCommand(context.TODO(), command).Decode(&result)
Para obtener una lista completa de los comandos de base de datos y los parámetros correspondientes, consulta el Sección Información adicional.
Nota
preferencia de lectura
RunCommand() y RunCommandCursor() no obedecen la preferencia de lectura que hayas configurado en tu objeto Database en otra parte de tu código. Puedes establecer una preferencia de lectura para la ejecución de comandos si pasas un objeto RunCmdOptions a cualquiera de los dos métodos:
opts := options.RunCmd().SetReadPreference(readpref.Primary()) cursor, err := db.RunCommandCursor(context.TODO(), command, opts)
Para obtener más información sobre las opciones de preferencia de lectura, véase Lee y escribe configuraciones.
Respuesta
Cada método devuelve un objeto SingleResult o un cursor que contiene la respuesta de la base de datos después de ejecutar el comando. Cada comando de base de datos realiza una función diferente, por lo que el contenido de la respuesta puede variar según los comandos. Sin embargo, cada respuesta contiene documentos con los siguientes campos:
Campo | Descripción |
|---|---|
<command result> | Proporciona campos específicos del comando de base de datos. Por ejemplo, |
| Indica si el comando ha tenido éxito ( |
| Indica el tiempo lógico de la operación. MongoDB utiliza el tiempo lógico para ordenar las operaciones. Para aprender más sobre el tiempo lógico, consulte nuestra entrada de blog acerca del Reloj Lógico Global. |
| Requiere un documento que devuelva el tiempo firmado de clúster. El tiempo de clúster es un tiempo lógico utilizado para el ordenamiento de operaciones. El documento contiene los siguientes campos:
|
Ejemplo
El siguiente código muestra cómo puedes utilizar el método RunCommand() para ejecutar el comando explain para una operación count en la colección flowers de la base de datos db. El comando explain se ejecuta en el modo de verbosidad "queryPlanner":
db := client.Database("db") // Creates commands to count documents in a collection and explain // how the count command runs countCommand := bson.D{{"count", "flowers"}} explainCommand := bson.D{{"explain", countCommand}, {"verbosity", "queryPlanner"}} // Retrieves results of the explain command var result bson.M err = db.RunCommand(context.TODO(), explainCommand).Decode(&result)
Salida
En el output, deberías ver campos explicando 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": "db", "count": "flowers" }, "explainVersion": "1", "ok": 1, "operationTime": { "T": 1673969525, "I": 24 }, "queryPlanner": { "indexFilterSet": false, "maxIndexedAndSolutionsReached": false, "maxIndexedOrSolutionsReached": false, "maxScansToExplodeReached": false, "namespace": "db.flowers", "rejectedPlans": [], "winningPlan": { "stage": "RECORD_STORE_FAST_COUNT" } }, "serverInfo": {...}, "serverParameters": { "internalDocumentSourceGroupMaxMemoryBytes": 104857600, ... } }
Ejecutar un comando Ejemplo: Archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB utilizando un URI de conexión. Para aprender más sobre cómo conectarte a tu instancia de MongoDB, consulta Crear un MongoClient. Este ejemplo también utiliza la base de datos sample_restaurants incluida en los conjuntos de datos de muestra de Atlas. Puedes cargarlos en tu base de datos en el nivel gratuito de MongoDB Atlas siguiendo los pasos en Comenzar con Atlas.
El siguiente ejemplo recupera estadísticas sobre la base de datos sample_restaurants:
// Runs a database command by using the Go driver package main import ( "context" "encoding/json" "fmt" "log" "os" "github.com/joho/godotenv" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) func main() { if err := godotenv.Load(); err != nil { log.Println("No .env file found") } var uri string if uri = os.Getenv("MONGODB_URI"); uri == "" { log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/es/docs/drivers/go/current/connect/mongoclient/#environment-variable") } client, err := mongo.Connect(options.Client().ApplyURI(uri)) if err != nil { panic(err) } defer func() { if err = client.Disconnect(context.TODO()); err != nil { panic(err) } }() { db := client.Database("sample_restaurants") // Retrieves statistics about the specified database command := bson.D{{"dbStats", 1}} var result bson.M // Runs the command and prints the database statistics err := db.RunCommand(context.TODO(), command).Decode(&result) // Prints a message if any errors occur during the command execution if err != nil { panic(err) } /* When you run this file, it should print something similar to the following: { "avgObjSize": 548.4101901854896, "collections": 2, "dataSize": 14014074, "db": "sample_restaurants", "fileSize": 0, "indexSize": 286720, "indexes": 2, "nsSizeMB": 0, "numExtents": 0, "objects": 25554, "ok": 1, "storageSize": 8257536, "totalFreeStorageSize": 0, "views": 0 } */ output, err := json.MarshalIndent(result, "", " ") if err != nil { panic(err) } fmt.Printf("%s\n", output) } }
// results truncated { "avgObjSize": 548.4101901854896, "collections": 2, "dataSize": 14014074, "db": "sample_restaurants", "indexSize": 286720, ..., }
Información Adicional
Para más información sobre los conceptos de esta guía, consulta la siguiente documentación:
Para aprender cómo recuperar datos de un cursor, consulta la página de conceptos básicos Acceder a datos desde un cursor.