Este capítulo apresenta o uso de consultas a documentos MongoDB em Golang.
Tutoriais Prévios
Dica: Se não estiver familiarizado com a sintaxe de consulta do MongoDB, leia primeiro o tutorial do MongoDB. A sintaxe de expressão utilizada para operações no MongoDB em Golang é a mesma.
Preparar Dados de Teste
Inserir um lote de dados de documentos na coleção coll
.
docs := []interface{}{
bson.D{
{"item", "journal"},
{"qty", 25},
{"size", bson.D{
{"h", 14},
{"w", 21},
{"uom", "cm"},
}},
{"status", "A"},
},
// ... (outros dados de documentos)
}
resultado, err := coll.InsertMany(context.Background(), docs)
Consultar Todos os Documentos
cursor, err := coll.Find(
context.Background(),
bson.D{}, // Definir condição de consulta vazia
)
Condições de Consulta de Igualdade
Semelhante à correspondência de igualdade do SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", "D"}}, // Condição equivalente: status = D
)
Operador de Consulta in
Similar à consulta in
do SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // Condição equivalente: status in ('A', 'D')
Condições de Consulta and
Similar à expressão lógica and
do SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condição equivalente: status='A' and qty < 30
{"status", "A"},
{"qty", bson.D{{"$lt", 30}}},
})
Condições de Consulta or
Similar à expressão lógica or
do SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condição equivalente: status = "A" OU qty < 30
{"$or", // Usando operador $or
bson.A{ // Usando definição de tipo de array bson.A
bson.D{{"status", "A"}},
bson.D{{"qty", bson.D{{"$lt", 30}}}},
}},
})
Exemplo de Consulta Composta
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condição equivalente: status = "A" E ( qty < 30 OU item LIKE "p%")
{"status", "A"},
{"$or", bson.A{
bson.D{{"qty", bson.D{{"$lt", 30}}}},
bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
}},
})
Percorrer Resultados da Consulta
Exemplo 1
// Consultar documentos onde o nome é 'Bob'
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
log.Fatal(err)
}
// Definir uma matriz de documentos do tipo bson.M, onde bson.M é uma estrutura de dados chave-valor semelhante a um mapa
var resultados []bson.M
// Usar a função All para recuperar todos os resultados da consulta e salvar os resultados na variável resultados.
if err = cursor.All(context.TODO(), &resultados); err != nil {
log.Fatal(err)
}
// Percorrer a matriz de resultados
for _, resultado := range resultados {
fmt.Println(resultado)
}
Explicação: O exemplo usa o tipo bson.M para armazenar dados do documento. Você pode personalizar um tipo de struct, desde que os campos correspondam ao documento.
Exemplo 2
// Definir uma variável do tipo struct para salvar o resultado da consulta
var resultado struct {
Value float64
}
// Definir a condição de consulta do documento name = 'pi'
filtro := bson.D{{"name", "pi"}}
// Criar um objeto de contexto e definir o tempo limite da consulta para 5 segundos
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Consultar um único dado com base na condição e usar a função Decode para salvar o resultado na variável resultado
err = collection.FindOne(ctx, filtro).Decode(&resultado)
// Verificar erros de consulta
if err == mongo.ErrNoDocuments {
// Documento não encontrado
fmt.Println("Documento não existe")
} else if err != nil {
log.Fatal(err)
}
// Outro tratamento
Dica: Para uma sintaxe mais sofisticada de expressão de consulta do MongoDB, consulte o tutorial do MongoDB.