Questo capitolo introduce l'uso delle query di documenti Golang MongoDB.
Tutorial Prerequisiti
Suggerimento: se non conosci la sintassi delle query di MongoDB, leggi prima il tutorial su MongoDB. La sintassi espressiva utilizzata per le operazioni di MongoDB in Golang è la stessa.
Prepara i Dati di Test
Inserisci un insieme di dati di documento nella raccolta coll
.
docs := []interface{}{
bson.D{
{"item", "journal"},
{"qty", 25},
{"size", bson.D{
{"h", 14},
{"w", 21},
{"uom", "cm"},
}},
{"status", "A"},
},
// ... (altri dati del documento)
}
result, err := coll.InsertMany(context.Background(), docs)
Query di Tutti i Documenti
cursor, err := coll.Find(
context.Background(),
bson.D{}, // Imposta condizione di query vuota
)
Condizioni di Query di Uguaglianza
Simile alla corrispondenza di uguaglianza di SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", "D"}}, // Condizione equivalente: status = D
)
Operatore di Query in
Simile alla query in
di SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // Condizione equivalente: status in ('A', 'D')
Condizioni di Query and
Simile all'espressione logica and
di SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condizione equivalente: status='A' e qty < 30
{"status", "A"},
{"qty", bson.D{{"$lt", 30}}},
})
Condizioni di Query or
Simile all'espressione logica or
di SQL.
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condizione equivalente: status = "A" O qty < 30
{"$or", // Using $or operator
bson.A{ // Using bson.A array type definition
bson.D{{"status", "A"}},
bson.D{{"qty", bson.D{{"$lt", 30}}}},
}},
})
Esempio di Query Composta
cursor, err := coll.Find(
context.Background(),
bson.D{ // Condizione equivalente: status = "A" E ( 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: ""}}},
}},
})
Attraversa i Risultati della Query
Esempio 1
// Query dei documenti in cui il nome è 'Bob'
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
log.Fatal(err)
}
// Definisci un array di documenti di tipo bson.M, dove bson.M è una struttura dati chiave-valore simile a una mappa
var results []bson.M
// Utilizza la funzione All per recuperare tutti i risultati della query e salvare i risultati nella variabile results.
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatal(err)
}
// Attraversa l'array di risultati
for _, result := range results {
fmt.Println(result)
}
Spiegazione: L'esempio utilizza il tipo bson.M per memorizzare i dati del documento. Puoi personalizzare un tipo di struct purché i campi corrispondano al documento.
Esempio 2
// Definisci una variabile di tipo struct per salvare il risultato della query
var result struct {
Value float64
}
// Definisci la condizione di query del documento nome = 'pi'
filter := bson.D{{"name", "pi"}}
// Crea un oggetto contesto e imposta il timeout della query a 5 secondi
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Esegui una query di singolo dato in base alla condizione e utilizza la funzione Decode per salvare il risultato nella variabile result
err = collection.FindOne(ctx, filter).Decode(&result)
// Controlla gli errori della query
if err == mongo.ErrNoDocuments {
// Documento non trovato
fmt.Println("Documento non esiste")
} else if err != nil {
log.Fatal(err)
}
// Altro gestione
Suggerimento: Per una sintassi di espressione di query MongoDB più sofisticata, consulta il tutorial su MongoDB.