To jest rozdział dotyczący używania zapytań do dokumentów MongoDB w GoLang.
Wymagane samouczki
Wskazówka: Jeśli nie znasz składni zapytań MongoDB, przeczytaj najpierw samouczek MongoDB. Składnia wyrażeń używana do operacji MongoDB w GoLang jest taka sama.
Przygotowanie danych testowych
Wstaw partię danych dokumentów do kolekcji coll
.
docs := []interface{}{
bson.D{
{"item", "journal"},
{"qty", 25},
{"size", bson.D{
{"h", 14},
{"w", 21},
{"uom", "cm"},
}},
{"status", "A"},
},
// ... (inne dane dokumentów)
}
wynik, błąd := coll.InsertMany(context.Background(), docs)
Zapytanie o wszystkie dokumenty
kursor, błąd := coll.Find(
context.Background(),
bson.D{}, // Ustaw puste warunki zapytania
)
Warunki zapytania równości
Podobne do dopasowania równości w SQL.
kursor, błąd := coll.Find(
context.Background(),
bson.D{{"status", "D"}}, // Warunek równoważny: status = D
)
Operator zapytania in
Podobne do zapytania in
w SQL.
kursor, błąd := coll.Find(
context.Background(),
bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // Warunek równoważny: status in ('A', 'D')
Warunki zapytania and
Podobne do logicznego wyrażenia and
w SQL.
kursor, błąd := coll.Find(
context.Background(),
bson.D{ // Warunek równoważny: status='A' and qty < 30
{"status", "A"},
{"qty", bson.D{{"$lt", 30}}},
})
Warunki zapytania or
Podobne do logicznego wyrażenia or
w SQL.
kursor, błąd := coll.Find(
context.Background(),
bson.D{ // Warunek równoważny: status = "A" OR qty < 30
{"$or", // Użyj operatora $or
bson.A{ // Użyj definicji typu tablicy bson.A
bson.D{{"status", "A"}},
bson.D{{"qty", bson.D{{"$lt", 30}}}},
}},
})
Przykład złożonego zapytania
kursor, błąd := coll.Find(
context.Background(),
bson.D{ // Warunek równoważny: status = "A" AND ( qty < 30 OR item LIKE "p%")
{"status", "A"},
{"$or", bson.A{
bson.D{{"qty", bson.D{{"$lt", 30}}}},
bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
}},
})
Przejście przez wyniki zapytania
Przykład 1
// Zapytaj dokumenty, gdzie nazwa to 'Bob'
kursor, błąd := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if błąd != nil {
log.Fatal(błąd)
}
// Zdefiniuj tablicę dokumentów typu bson.M, gdzie bson.M jest strukturą danych klucz-wartość podobną do mapy
var wyniki []bson.M
// Użyj funkcji All do pobrania wszystkich wyników zapytania i zapisz wyniki do zmiennej wyniki
if błąd = kursor.All(context.TODO(), &wyniki); błąd != nil {
log.Fatal(błąd)
}
// Przejdź przez tablicę wyników
for _, wynik := range wyniki {
fmt.Println(wynik)
}
Wyjaśnienie: Przykład używa typu bson.M do przechowywania danych dokumentów. Możesz dostosować typ struktury o ile pola są zgodne z dokumentem.
Przykład 2:
// Zdefiniuj zmienną typu struktury do zapisania wyniku zapytania
var wynik struct {
Value float64
}
// Zdefiniuj warunek zapytania dokumentu name = 'pi'
filtr := bson.D{{"name", "pi"}}
// Utwórz obiekt kontekstu i ustaw limit czasu zapytania na 5 sekund
ctx, anuluj = context.WithTimeout(context.Background(), 5*time.Second)
defer anuluj()
// Zapytaj pojedyncze dane na podstawie warunku i użyj funkcji Decode do zapisania wyniku do zmiennej wynik
błąd = kolekcja.FindOne(ctx, filtr).Decode(&wynik)
// Sprawdź błędy zapytania
if błąd == mongo.ErrNoDocuments {
// Dokument nie znaleziony
fmt.Println("Dokument nie istnieje")
} else if błąd != nil {
log.Fatal(błąd)
}
// Inne działania
Wskazówka: Aby uzyskać bardziej zaawansowaną składnię wyrażeń zapytań MongoDB, proszę odnieść się do samouczka MongoDB.