Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym przewodniku wyjaśniono, jak utworzyć aplikację konsolową języka Go w celu nawiązania połączenia z klastrem usługi Azure DocumentDB. Skonfigurujesz środowisko programistyczne, używając pakietu azidentity z zestawu Azure SDK for Go do uwierzytelniania i wykonywania typowych operacji na dokumentach w bazie danych.
Wymagania wstępne
Subskrypcja platformy Azure
- Jeśli nie masz subskrypcji platformy Azure, utwórz bezpłatne konto
Istniejący klaster usługi Azure DocumentDB
- Jeśli nie masz klastra, utwórz nowy klaster
Użyj środowiska Bash w Azure Cloud Shell. Aby uzyskać więcej informacji, zobacz Get started with Azure Cloud Shell.
Jeśli wolisz uruchamiać polecenia referencyjne interfejsu wiersza polecenia lokalnie, zainstaluj Azure CLI. Jeśli korzystasz z systemu Windows lub macOS, rozważ uruchomienie Azure CLI w kontenerze Docker. Aby uzyskać więcej informacji, zobacz Jak uruchomić Azure CLI w kontenerze Docker.
Jeśli korzystasz z instalacji lokalnej, zaloguj się do Azure CLI za pomocą polecenia az login. Aby zakończyć proces uwierzytelniania, wykonaj kroki wyświetlane na Twoim terminalu. Aby uzyskać inne opcje logowania, zobacz Uwierzytelnianie na platformie Azure przy użyciu interfejsu wiersza polecenia platformy Azure.
Gdy zostaniesz o to poproszony/a, zainstaluj rozszerzenie Azure CLI przy pierwszym użyciu. Aby uzyskać więcej informacji na temat rozszerzeń, zobacz Używanie rozszerzeń i zarządzanie nimi za pomocą interfejsu wiersza polecenia platformy Azure.
Uruchom az version, aby sprawdzić zainstalowaną wersję i biblioteki zależne. Aby zaktualizować do najnowszej wersji, uruchom az upgrade.
Uwierzytelnianie Microsoft Entra zostało skonfigurowane dla klastra z przypisaną rolą dla Twojej tożsamości
root.- Aby włączyć uwierzytelnianie firmy Microsoft Entra, zapoznaj się z przewodnikiem konfiguracji.
Najnowsza wersja języka Go.
Konfigurowanie aplikacji konsolowej
Następnie utwórz nowy projekt aplikacji konsolowej i zaimportuj niezbędne biblioteki do uwierzytelniania w klastrze.
Utwórz nowy moduł Języka Go dla projektu przy użyciu
go mod initpolecenia .go mod init cosmicworksZainstaluj pakiet
azidentity, aby obsługiwać uwierzytelnianie za pomocą Microsoft Entra ID.go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentityZainstaluj pakiet
mongo, aby współdziałać z klastrem.go get -u go.mongodb.org/mongo-driver/v2/mongoUtwórz nowy plik o nazwie
main.gow katalogu projektu.touch main.go
Połącz się z klastrem
Teraz użyj biblioteki Azure.Identity, aby uzyskać TokenCredential, którego możesz użyć do połączenia się z klastrem. Oficjalny sterownik bazy danych MongoDB ma specjalny interfejs, który należy zaimplementować w celu uzyskania tokenów z firmy Microsoft Entra do użycia podczas nawiązywania połączenia z klastrem.
Zacznij od zaimportowania wymaganych pakietów w górnej części
main.gopliku.import ( "context" "crypto/tls" "encoding/json" "fmt" "time" "github.com/Azure/azure-sdk-for-go/sdk/azcore/policy" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" )Utwórz kontekst tła używany w całej aplikacji.
ctx := context.Background()Utwórz wystąpienie
DefaultAzureCredential, które jest używane do uwierzytelniania za pomocą Microsoft Entra ID.credential, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { panic(err) }Utwórz funkcję wywołania zwrotnego, która uzyskuje tokeny dostępu, gdy sterownik bazy danych MongoDB musi się uwierzytelnić.
azureIdentityTokenCallback := func(_ context.Context, _ *options.OIDCArgs) (*options.OIDCCredential, error) { accessToken, err := credential.GetToken(ctx, policy.TokenRequestOptions{ Scopes: []string{"https://ossrdbms-aad.database.windows.net/.default"}, }) if err != nil { return nil, err } return &options.OIDCCredential{ AccessToken: accessToken.Token, }, nil }Ustaw nazwę klastra i skonstruuj identyfikator URI połączenia.
clusterName := "<azure-documentdb-cluster-name>" uri := fmt.Sprintf("mongodb+srv://%s.global.mongocluster.cosmos.azure.com/", clusterName)Skonfiguruj poświadczenia uwierzytelniania dla klienta bazy danych MongoDB.
auth := options.Credential{ AuthMechanism: "MONGODB-OIDC", OIDCMachineCallback: azureIdentityTokenCallback, }Skonfiguruj opcje klienta z parametrami połączenia, konfiguracją zabezpieczeń warstwy transportu (TLS) i uwierzytelnianiem.
clientOptions := options.Client(). ApplyURI(uri). SetConnectTimeout(2 * time.Minute). SetRetryWrites(true). SetTLSConfig(&tls.Config{}). SetAuth(auth)Utwórz instancję klienta MongoDB przy użyciu skonfigurowanych opcji.
client, err := mongo.Connect(clientOptions) if err != nil { panic(err) } fmt.Println("Client created")Dodaj instrukcję odroczenia, aby upewnić się, że klient jest prawidłowo odłączony po zakończeniu działania aplikacji.
defer func() { if err = client.Disconnect(ctx); err != nil { panic(err) } }()
Wykonywanie typowych operacji
Na koniec użyj oficjalnej biblioteki do wykonywania typowych zadań z bazami danych, kolekcjami i dokumentami. W tym miejscu użyjesz tych samych klas i metod, których należy użyć do interakcji z bazą danych MongoDB lub DocumentDB w celu zarządzania kolekcjami i elementami.
Uzyskaj odwołanie do bazy danych według nazwy.
database := client.Database("<database-name>") fmt.Println("Database pointer created")Uzyskaj odwołanie do swojej kolekcji w bazie danych.
collection := database.Collection("<collection-name>") fmt.Println("Collection pointer created")Zdefiniuj strukturę Produktu, aby reprezentować strukturę dokumentu.
type Product struct { ID string `bson:"_id"` Category string `bson:"category"` Name string `bson:"name"` Quantity int `bson:"quantity"` Price decimal128.Decimal128 `bson:"price"` Clearance bool `bson:"clearance"` }Utwórz lub zaktualizuj dokument przy użyciu operacji skonfigurowanej
collection.ReplaceOnedla upsert.opts := options.Replace().SetUpsert(true) upsertFilter := bson.D{{Key: "_id", Value: "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"}} priceDecimal, err := bson.ParseDecimal128("850.00") if err != nil { panic(err) } document := Product{ ID: "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb", Category: "gear-surf-surfboards", Name: "Yamba Surfboard", Quantity: 12, Price: priceDecimal, Clearance: false} result, err := collection.ReplaceOne(ctx, upsertFilter, document, opts) if err != nil { panic(err) } fmt.Printf("Documents upserted count:\t%d\n", result.UpsertedCount)Przeczytaj konkretny dokument przy użyciu
collection.FindOnei filtru z_idorazcategory.readFilter := bson.D{{Key: "_id", Value: "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"}, {Key: "category", Value: "gear-surf-surfboards"}} var target Product err = collection.FindOne(ctx, readFilter).Decode(&target) if err != nil { panic(err) } fmt.Printf("Read document name:\t%s\n", target.Name)Wykonaj zapytanie dotyczące wielu dokumentów pasujących do określonego
categoryprzy użyciu poleceniacollection.Find.queryFilter := bson.D{{Key: "category", Value: "gear-surf-surfboards"}} cursor, err := collection.Find(ctx, queryFilter) if err != nil { panic(err) }Pobierz wszystkie pasujące dokumenty z kursora.
var products []Product if err = cursor.All(ctx, &products); err != nil { panic(err) }Iterowanie i wyświetlanie wszystkich produktów znalezionych w zapytaniu.
for _, product := range products { json, err := json.Marshal(product) if err != nil { panic(err) } fmt.Printf("Found document:\t%s\n", string(json)) }