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.