Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 .
- Jika Anda lebih suka menjalankan perintah referensi CLI secara lokal, masuk ke Azure CLI dengan menggunakan
Autentikasi Microsoft Entra dikonfigurasi untuk kluster dengan identitas Anda yang diberikan peran
dbOwner
.- Untuk mengaktifkan autentikasi Microsoft Entra, tinjau panduan konfigurasi.
Versi terbaru Go.
Mengonfigurasi aplikasi konsol Anda
Selanjutnya, buat project aplikasi konsol baru dan masukkan pustaka yang diperlukan untuk mengautentikasi ke dalam kluster Anda.
Buat modul Go baru untuk proyek Anda menggunakan
go mod init
perintah .go mod init cosmicworks
azidentity
Instal paket untuk menangani autentikasi dengan ID Microsoft Entra.go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
Instal paket
mongo
untuk berinteraksi dengan kluster MongoDB vCore Anda.go get -u go.mongodb.org/mongo-driver/v2/mongo
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.
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" )
Buat konteks latar belakang yang digunakan di seluruh aplikasi Anda.
ctx := context.Background()
Buat instans
DefaultAzureCredential
yang digunakan untuk mengautentikasi dengan MICROSOFT Entra ID.credential, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { panic(err) }
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 }
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)
Konfigurasikan kredensial autentikasi untuk klien MongoDB.
auth := options.Credential{ AuthMechanism: "MONGODB-OIDC", OIDCMachineCallback: azureIdentityTokenCallback, }
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)
Buat instans klien MongoDB menggunakan opsi yang dikonfigurasi.
client, err := mongo.Connect(clientOptions) if err != nil { panic(err) } fmt.Println("Client created")
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.
Dapatkan referensi ke database Anda berdasarkan nama.
database := client.Database("<database-name>") fmt.Println("Database pointer created")
Dapatkan referensi ke koleksi Anda dalam database.
collection := database.Collection("<collection-name>") fmt.Println("Collection pointer created")
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"` }
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)
Baca dokumen tertentu menggunakan
collection.FindOne
dan filter dengan_id
dancategory
.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)
Membuat kueri untuk beberapa dokumen yang cocok dengan
category
tertentu menggunakancollection.Find
.queryFilter := bson.D{{Key: "category", Value: "gear-surf-surfboards"}} cursor, err := collection.Find(ctx, queryFilter) if err != nil { panic(err) }
Ambil semua dokumen yang cocok dari kursor.
var products []Product if err = cursor.All(ctx, &products); err != nil { panic(err) }
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)) }