Este capítulo introduce el uso de las consultas de documentos MongoDB en Golang.
Tutoriales previos
Consejo: Si no estás familiarizado con la sintaxis de consulta de MongoDB, lee primero el tutorial de MongoDB. La sintaxis de expresión utilizada para las operaciones de MongoDB en Golang es la misma.
Preparar datos de prueba
Inserta un lote de datos de documentos en la colección coll
.
docs := []interface{}{
bson.D{
{"item", "journal"},
{"qty", 25},
{"size", bson.D{
{"h", 14},
{"w", 21},
{"uom", "cm"},
}},
{"status", "A"},
},
// ... (otros datos de documentos)
}
resultado, err := coll.InsertMany(context.Background(), docs)
Consultar todos los documentos
cursor, err := coll.Find(
context.Background(),
bson.D{}, // Establecer condición de consulta vacía
)
Condiciones de consulta de igualdad
Similar al emparejamiento de igualdad de SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", "D"}}, // Condición equivalente: status = D
)
Operador de consulta in
Similar a la consulta in
de SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // Condición equivalente: status in ('A', 'D')
Condiciones de consulta and
Similar a la expresión lógica and
de SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condición equivalente: status='A' y qty < 30
{"status", "A"},
{"qty", bson.D{{"$lt", 30}}},
})
Condiciones de consulta or
Similar a la expresión lógica or
de SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condición equivalente: status = "A" O qty < 30
{"$or", // Usando el operador $or
bson.A{ // Usando definición de tipo de array bson.A
bson.D{{"status", "A"}},
bson.D{{"qty", bson.D{{"$lt", 30}}}},
}},
})
Ejemplo de consulta compuesta
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condición equivalente: status = "A" Y ( qty < 30 O item LIKE "p%")
{"status", "A"},
{"$or", bson.A{
bson.D{{"qty", bson.D{{"$lt", 30}}}},
bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
}},
})
Recorrer resultados de consulta
Ejemplo 1
// Consultar documentos donde el nombre es 'Bob'
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
log.Fatal(err)
}
// Definir un array de documentos de tipo bson.M, donde bson.M es una estructura de datos de clave-valor similar a un mapa
var results []bson.M
// Usar la función All para recuperar todos los resultados de la consulta y guardar los resultados en la variable results.
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatal(err)
}
// Recorrer el array de resultados
for _, result := range results {
fmt.Println(result)
}
Explicación: El ejemplo utiliza el tipo bson.M para almacenar datos de documentos. Puedes personalizar un tipo de struct siempre y cuando los campos coincidan con el documento.
Ejemplo 2:
// Definir una variable de tipo struct para guardar el resultado de la consulta
var result struct {
Value float64
}
// Definir la condición de consulta del documento nombre = 'pi'
filtro := bson.D{{"name", "pi"}}
// Crear un objeto de contexto y establecer el tiempo de espera de la consulta en 5 segundos
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Consultar un solo dato basado en la condición y usar la función Decode para guardar el resultado en la variable result
err = collection.FindOne(ctx, filtro).Decode(&result)
// Comprobar errores de consulta
if err == mongo.ErrNoDocuments {
// Documento no encontrado
fmt.Println("El documento no existe")
} else if err != nil {
log.Fatal(err)
}
// Otro manejo
Consejo: Para una sintaxis de expresión de consulta de MongoDB más sofisticada, consulta el tutorial de MongoDB.