Docs Menu
Docs Home
/ /

Ejecute un comando de base de datos

En esta guía, aprenderá a ejecutar un comando de base de datos con el controlador Go. 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.

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.DEl controlador Go proporciona los siguientes métodos para ejecutar comandos de base de datos:

  • RunCommand(), que devuelve la respuesta del comando como un tipo SingleResult. Puedes utilizar este método con cualquier comando de base de datos.

  • RunCommandCursor(), que devuelve la respuesta del comando como tipo Cursor. Puede usar este método si el comando de base de datos devuelve varios documentos de resultados.

El siguiente código muestra cómo puede utilizar el método RunCommand() 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:

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, consulte la Sección de Información Adicional.

Nota

preferencia de lectura

RunCommand() y RunCommandCursor() no obedecen la preferencia de lectura que haya configurado en su objeto Database en otra parte del código. Puede establecer una preferencia de lectura para la ejecución de comandos pasando un objeto RunCmdOptions a cualquiera de los 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, consulte la Página de fundamentos deconfiguración de lectura y escritura.

Cada método devuelve un objeto SingleResult o un cursor que contiene la respuesta de la base de datos tras la ejecución del comando. 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. 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, count devuelve el campo n y explain el campo queryPlanner.

ok

Indica si el comando ha tenido éxito (1) o ha fallado (0).

operationTime

Indica 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 blog sobre el Reloj Lógico Global.

$clusterTime

Proporciona un documento que devuelve la hora de clúster firmada. La hora de clúster es una hora lógica utilizada para ordenar las operaciones.

El documento contiene los siguientes campos:

  • clusterTime, que es la marca de tiempo del tiempo de clúster más alto conocido para el miembro.

  • signature, que es un documento que contiene el hash de la hora del clúster y la ID de la clave utilizada para firmar la hora del clúster.

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)

En la salida, debería ver 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": "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,
...
}
}

Nota

Configuración de ejemplo

Este ejemplo se conecta a una instancia de MongoDB mediante una URI de conexión. Para obtener más información sobre cómo conectarse a su instancia de MongoDB, consulte la guía "Crear un MongoClient". Este ejemplo también utiliza la sample_restaurants base de datos incluida en los conjuntos de datos de ejemplo de Atlas. Puede cargarlos en su base de datos en la versión gratuita de MongoDB Atlas siguiendo la Guía de introducción a 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,
...,
}

Para más información sobre los conceptos de esta guía, consulta la siguiente documentación:

Para aprender a recuperar datos de un cursor, consulte la página Fundamentos de acceder a datos desde un cursor.

Volver

Indexes

En esta página