Dieses Kapitel führt in die Verwendung von Golang MongoDB-Dokumentabfragen ein.

Voraussetzung Tutorials

Tipp: Wenn Sie mit der MongoDB-Abfragesyntax nicht vertraut sind, lesen Sie bitte zuerst das MongoDB-Tutorial. Die Ausdruckssyntax für MongoDB-Operationen in Golang ist dieselbe.

Testdaten vorbereiten

Fügen Sie eine Reihe von Dokumentendaten in die Sammlung coll ein.

docs := []interface{}{
    bson.D{
        {"item", "journal"},
        {"qty", 25},
        {"size", bson.D{
            {"h", 14},
            {"w", 21},
            {"uom", "cm"},
        }},
        {"status", "A"},
    },
    // ... (andere Dokumentendaten)
}

result, err := coll.InsertMany(context.Background(), docs)

Alle Dokumente abfragen

cursor, err := coll.Find(
    context.Background(),
    bson.D{}, // Leere Abfragebedingung setzen
)

Abfragebedingungen für Gleichheit

Ähnlich wie bei einer Gleichheitsübereinstimmung in SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", "D"}},   // Äquivalente Bedingung: status = D
)

in-Abfrageoperator

Ähnlich wie bei einer in-Abfrage in SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // Äquivalente Bedingung: status in ('A', 'D')

Abfragebedingungen mit and

Ähnlich wie bei einem und-logischen Ausdruck in SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // Äquivalente Bedingung: status='A' und qty < 30 
        {"status", "A"},
        {"qty", bson.D{{"$lt", 30}}},
    })

Abfragebedingungen mit or

Ähnlich wie bei einem oder-logischen Ausdruck in SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // Äquivalente Bedingung: status = "A" ODER qty < 30
        {"$or", // Den $or-Operator verwenden
            bson.A{ // Die Definition des Typs bson.A verwenden
                bson.D{{"status", "A"}},
                bson.D{{"qty", bson.D{{"$lt", 30}}}},
            }},
    })

Beispiel für zusammengesetzte Abfragen

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // Äquivalente Bedingung: status = "A" UND (qty < 30 ODER item entspricht "p%")
        {"status", "A"},
        {"$or", bson.A{
            bson.D{{"qty", bson.D{{"$lt", 30}}}},
            bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
        }},
    })

Abfrageergebnisse durchlaufen

Beispiel 1

// Dokumente abfragen, bei denen der Name 'Bob' ist
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
	log.Fatal(err)
}

// Ein Array von Dokumenten vom Typ bson.M definieren, wobei bson.M eine Schlüssel-Wert-Datenstruktur ähnlich einer Map ist
var results []bson.M
// Die All-Funktion verwenden, um alle Abfrageergebnisse abzurufen und die Ergebnisse in der Variable 'results' zu speichern.
if err = cursor.All(context.TODO(), &results); err != nil {
	log.Fatal(err)
}

// Das Ergebnis-Array durchlaufen
for _, result := range results {
	fmt.Println(result)
}

Erklärung: Das Beispiel verwendet den Typ bson.M, um Dokumentendaten zu speichern. Sie können auch einen eigenen Strukturtyp anpassen, solange die Felder mit dem Dokument übereinstimmen.

Beispiel 2:

// Einen Variablentyp struct definieren, um das Abfrageergebnis zu speichern
var result struct {
    Value float64
}

// Die Dokumentabfragebedingung name = 'pi' definieren
filter := bson.D{{"name", "pi"}}
// Einen Kontextobjekt erstellen und den Abfrage-Timeout auf 5 Sekunden setzen
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Basierend auf der Bedingung eine einzelne Datenabfrage durchführen und die Decode-Funktion verwenden, um das Ergebnis in der Variablen 'result' zu speichern
err = collection.FindOne(ctx, filter).Decode(&result)

// Abfragefehler überprüfen
if err == mongo.ErrNoDocuments {
    // Dokument nicht gefunden
    fmt.Println("Dokument existiert nicht")
} else if err != nil {
    log.Fatal(err)
}
// Andere Bearbeitung

Tipp: Für eine anspruchsvollere MongoDB-Abfrageausdruckssyntax verweisen Sie bitte auf das MongoDB-Tutorial.