Bagikan melalui


Membangun aplikasi konsol Go dengan Azure Cosmos DB untuk MongoDB vCore

Panduan ini menjelaskan cara membuat aplikasi konsol Go untuk menyambungkan ke kluster Azure Cosmos DB for MongoDB vCore. Anda menyiapkan lingkungan pengembangan, menggunakan azidentity paket dari Azure SDK for Go untuk mengautentikasi, dan melakukan operasi umum pada dokumen dalam database.

Prasyarat

  • Kluster Azure Cosmos DB untuk MongoDB (vCore) yang sudah ada.
  • Versi terbaru Azure CLI di Azure Cloud Shell.

    • Jika Anda lebih suka menjalankan perintah referensi CLI secara lokal, masuk ke Azure CLI dengan menggunakan az login perintah .
  • Autentikasi Microsoft Entra dikonfigurasi untuk kluster dengan identitas Anda yang diberikan peran dbOwner.

  • Versi terbaru Go.

Mengonfigurasi aplikasi konsol Anda

Selanjutnya, buat project aplikasi konsol baru dan masukkan pustaka yang diperlukan untuk mengautentikasi ke dalam kluster Anda.

  1. Buat modul Go baru untuk proyek Anda menggunakan go mod init perintah .

    go mod init cosmicworks
    
  2. azidentity Instal paket untuk menangani autentikasi dengan ID Microsoft Entra.

    go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  3. Instal paket mongo untuk berinteraksi dengan kluster MongoDB vCore Anda.

    go get -u  go.mongodb.org/mongo-driver/v2/mongo
    
  4. Buat file baru bernama main.go di direktori proyek Anda.

    touch main.go
    

Menyambungkan ke kluster

Sekarang, gunakan pustaka Azure.Identity untuk mendapatkan TokenCredential yang dapat Anda gunakan untuk menghubungkan ke kluster Anda. Driver Resmi MongoDB memiliki antarmuka khusus yang harus diimplementasikan untuk mendapatkan token dari Microsoft Entra untuk digunakan saat menyambungkan ke kluster.

  1. Mulailah dengan mengimpor paket yang diperlukan di bagian atas file Anda main.go .

    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. Buat konteks latar belakang yang digunakan di seluruh aplikasi Anda.

     ctx := context.Background()
    
  3. Buat instans DefaultAzureCredential yang digunakan untuk mengautentikasi dengan MICROSOFT Entra ID.

     credential, err := azidentity.NewDefaultAzureCredential(nil)
     if err != nil {
     	panic(err)
     }
    
  4. Buat fungsi panggilan balik yang mendapatkan token akses saat driver MongoDB perlu mengautentikasi.

     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. Atur nama kluster Anda dan buat URI koneksi.

     clusterName := "<azure-cosmos-db-mongodb-vcore-cluster-name>"
     uri := fmt.Sprintf("mongodb+srv://%s.global.mongocluster.cosmos.azure.com/", clusterName)
    
  6. Konfigurasikan kredensial autentikasi untuk klien MongoDB.

     auth := options.Credential{
     	AuthMechanism:       "MONGODB-OIDC",
     	OIDCMachineCallback: azureIdentityTokenCallback,
     }
    
  7. Siapkan opsi klien dengan parameter koneksi, konfigurasi keamanan lapisan transportasi (TLS), dan autentikasi.

     clientOptions := options.Client().
     	ApplyURI(uri).
     	SetConnectTimeout(2 * time.Minute).
     	SetRetryWrites(true).
     	SetTLSConfig(&tls.Config{}).
     	SetAuth(auth)
    
  8. Buat instans klien MongoDB menggunakan opsi yang dikonfigurasi.

     client, err := mongo.Connect(clientOptions)
     if err != nil {
     	panic(err)
     }
    
     fmt.Println("Client created")
    
  9. Tambahkan pernyataan 'defer' untuk memastikan klien terputus dengan benar saat aplikasi Anda dihentikan.

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

Melakukan operasi umum

Terakhir, gunakan pustaka resmi untuk melakukan tugas umum dengan database, koleksi, dan dokumen. Di sini, Anda menggunakan kelas dan metode yang sama dengan yang akan Anda gunakan untuk berinteraksi dengan MongoDB atau DocumentDB untuk mengelola koleksi dan item Anda.

  1. Dapatkan referensi ke database Anda berdasarkan nama.

     database := client.Database("<database-name>")
    
     fmt.Println("Database pointer created")
    
  2. Dapatkan referensi ke koleksi Anda dalam database.

     collection := database.Collection("<collection-name>")
    
     fmt.Println("Collection pointer created")
    
  3. Tentukan struktur Produk untuk mewakili struktur dokumen Anda.

    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. Membuat atau memperbarui dokumen menggunakan operasi yang dikonfigurasi collection.ReplaceOne untuk 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)
    
  5. Baca dokumen tertentu menggunakan collection.FindOne dan filter dengan _id dan category.

     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. Membuat kueri untuk beberapa dokumen yang cocok dengan category tertentu menggunakan collection.Find.

     queryFilter := bson.D{{Key: "category", Value: "gear-surf-surfboards"}}
     cursor, err := collection.Find(ctx, queryFilter)
     if err != nil {
     	panic(err)
     }
    
  7. Ambil semua dokumen yang cocok dari kursor.

     var products []Product
     if err = cursor.All(ctx, &products); err != nil {
     	panic(err)
     }
    
  8. Lakukan iterasi dan tampilkan semua produk yang ditemukan dalam pencarian.

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