Azure DocumentDB ile Go konsol uygulaması oluşturma

Bu kılavuzda, Azure DocumentDB kümesine bağlanmak için bir Go konsol uygulamasının nasıl oluşturulacağı açıklanmaktadır. Geliştirme ortamınızı ayarlar, kimlik doğrulaması yapmak için Go için Azure SDK'sından alınan paketi kullanır azidentity ve veritabanındaki belgeler üzerinde ortak işlemler gerçekleştirirsiniz.

Prerequisites

  • Mevcut bir Azure DocumentDB kümesi

Konsol uygulamanızı yapılandırma

Ardından, yeni bir konsol uygulaması projesi oluşturun ve kümenizde kimlik doğrulaması yapmak için gerekli kitaplıkları içeri aktarın.

  1. komutunu kullanarak go mod init projeniz için yeni bir Go modülü oluşturun.

    go mod init cosmicworks
    
  2. azidentity Microsoft Entra Id ile kimlik doğrulamasını işlemek için paketi yükleyin.

    go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  3. mongo Paketi yükleyin ve kümenizle etkileşime geçin.

    go get -u  go.mongodb.org/mongo-driver/v2/mongo
    
  4. Proje dizininizde adlı main.go yeni bir dosya oluşturun.

    touch main.go
    

Kümeye bağlanma

Şimdi kitaplığını Azure.IdentityTokenCredential kullanarak kümenize bağlanmak için bir kullanın. Resmi MongoDB sürücüsünün, kümeye bağlanırken kullanılmak üzere Microsoft Entra'dan belirteçleri almak için uygulanması gereken özel bir arabirimi vardır.

  1. Dosyanızın main.go en üstündeki gerekli paketleri içeri aktararak başlayın.

    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"
    )
    
  2. Uygulamanız genelinde kullanılan bir arka plan bağlamı oluşturun.

     ctx := context.Background()
    
  3. Microsoft Entra ID ile kimlik doğrulaması yapmak için kullanılan bir DefaultAzureCredential örneği oluşturun.

     credential, err := azidentity.NewDefaultAzureCredential(nil)
     if err != nil {
     	panic(err)
     }
    
  4. MongoDB sürücüsünün kimlik doğrulaması yapması gerektiğinde erişim belirteçleri alan bir geri çağırma işlevi oluşturun.

     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
     }
    
  5. Kümenizin adını ayarlayın ve bağlantı URI'sini oluşturun.

     clusterName := "<azure-documentdb-cluster-name>"
     uri := fmt.Sprintf("mongodb+srv://%s.global.mongocluster.cosmos.azure.com/", clusterName)
    
  6. MongoDB istemcisi için kimlik doğrulama kimlik bilgilerini yapılandırın.

     auth := options.Credential{
     	AuthMechanism:       "MONGODB-OIDC",
     	OIDCMachineCallback: azureIdentityTokenCallback,
     }
    
  7. Bağlantı parametreleri, aktarım katmanı güvenliği (TLS) yapılandırması ve kimlik doğrulaması ile istemci seçeneklerini ayarlayın.

     clientOptions := options.Client().
     	ApplyURI(uri).
     	SetConnectTimeout(2 * time.Minute).
     	SetRetryWrites(true).
     	SetTLSConfig(&tls.Config{}).
     	SetAuth(auth)
    
  8. Yapılandırılan seçenekleri kullanarak bir MongoDB istemci örneği oluşturun.

     client, err := mongo.Connect(clientOptions)
     if err != nil {
     	panic(err)
     }
    
     fmt.Println("Client created")
    
  9. Uygulamanızdan çıkıldığında istemcinin bağlantısının düzgün şekilde kesildiğinden emin olmak için bir erteleme deyimi ekleyin.

     defer func() {
     	if err = client.Disconnect(ctx); err != nil {
     		panic(err)
     	}
     }()
    

Yaygın işlemler gerçekleştirme

Son olarak veritabanları, koleksiyonlar ve belgelerle ortak görevleri gerçekleştirmek için resmi kitaplığı kullanın. Burada, koleksiyonlarınızı ve öğelerinizi yönetmek için MongoDB veya DocumentDB ile etkileşimde bulunurken kullandığınız sınıfları ve yöntemleri kullanırsınız.

  1. Adına göre veritabanınızın referansını alın.

     database := client.Database("<database-name>")
    
     fmt.Println("Database pointer created")
    
  2. Veritabanı içindeki koleksiyonunuza bir referans alın.

     collection := database.Collection("<collection-name>")
    
     fmt.Println("Collection pointer created")
    
  3. Belge yapınızı temsil eden bir Ürün yapısı tanımlayın.

    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"`
    }
    
  4. collection.ReplaceOne için yapılandırılan işlemi kullanarak belge oluşturun veya güncelleştirin.

     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)
    
  5. Belirli bir belgeyi collection.FindOne kullanarak ve _id ile category bir filtre okuyun.

     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)
    
  6. Belirli bir category eşleşen birden çok belgeyi collection.Find kullanarak sorgula.

     queryFilter := bson.D{{Key: "category", Value: "gear-surf-surfboards"}}
     cursor, err := collection.Find(ctx, queryFilter)
     if err != nil {
     	panic(err)
     }
    
  7. İmleçten eşleşen tüm belgeleri alın.

     var products []Product
     if err = cursor.All(ctx, &products); err != nil {
     	panic(err)
     }
    
  8. Sorguda bulunan tüm ürünleri yineleyip görüntüleyin.

     for _, product := range products {
     	json, err := json.Marshal(product)
     	if err != nil {
     		panic(err)
     	}
     	fmt.Printf("Found document:\t%s\n", string(json))
     }