MongoDB için Azure Cosmos DB kullanarak hesap, veritabanı ve koleksiyon oluşturma

Tamamlandı

Azure Cosmos DB, tam olarak yönetilen bir hizmet olarak platformdur (PaaS). Bu hizmeti kullanmak için öncelikle aboneliğimiz altında bir Azure Cosmos DB hesabı oluşturmamız gerekir. Hesabımız oluşturulduktan sonra veritabanı, koleksiyonlar ve belgeler ekleyebiliriz.

MongoDB için farklı Azure Cosmos DB model öğelerini oluşturmanın birkaç yolunu gözden geçirin.

Azure portalını kullanarak MongoDB için Azure Cosmos DB için hesap, veritabanı ve kapsayıcı oluşturma

Azure Cosmos DB hesabımızı ve öğelerini oluşturmanın bir yolu Azure portalını kullanmaktır. Bu örnekte, MongoDB için Azure Cosmos DB'yi kullanarak bir Azure Cosmos DB hesabı oluşturmak için Azure portalını kullanacağız. Ardından bir veritabanı ve koleksiyon ekleriz. Şimdilik, sonraki modüllerde daha ayrıntılı olarak ele aldığımız daha gelişmiş ayarları doldurma konusunda endişelenmeyin. Bu örnekte Temel Bilgiler sekmesini gözden geçirelim. Hesabımızı ve öğelerini oluşturalım.

MongoDB için Azure Cosmos DB için hesap oluşturma

  1. Azure portalında + Kaynak Oluştur'u seçin, Azure Cosmos DB'yi ve Oluştur'u seçin.

  2. MongoDB için Azure Cosmos DB'yi seçin.

  3. Aşağıdaki parametreleri girin.

    • Abonelik - Geçerli Azure aboneliğiniz.
    • Kaynak Grubu - Azure Cosmos DB hesabının oluşturulacağı yeni veya mevcut bir Azure Kaynak Grubu.
    • Hesap Adı - Azure Cosmos DB hesabınız için benzersiz bir ad. Bu ad Azure genelinde benzersiz olmalıdır. Hesap URI'niz, hesap adınızın sonuna mongo.cosmos.azure.com eklenmiştir.
    • Konum - Azure Cosmos DB hesabınızı barındıran coğrafi konum. Genellikle kullanıcılarınıza veya uygulamalarınıza yakın bir konum seçmelisiniz.
    • Kapasite modu - Önceki bir ünitede açıklandığı gibi, hesabınızın Sağlanan aktarım hızını veya Sunucusuz'nu kullanmasını seçebilirsiniz. Bu örnek için Sağlanan aktarım hızı'ni seçin.
    • Ücretsiz Katman İndirimi Uygula - Bu örnek için Uygulama seçmeyin.
    • Toplam hesap aktarım hızını sınırla - Bu örnek için işaretsiz bırakın.
    • Versiyon - 4.0'ı seçin.

    Not

    Desteklenen özelliklerden daha iyi yararlanmak için mümkün olduğunda 3.6+ sürümlerini kullanmanızı öneririz.

  4. Gözden Geçir + Oluştur'u seçin ve başarılı bir doğrulamada Oluştur'u seçin.

Not

Azure Cosmos DB hesabınızı oluşturmak birkaç dakika sürebilir.

MongoDB için Azure Cosmos DB için veritabanı ve kapsayıcı oluşturma

Azure portalında veritabanı ve kapsayıcı oluşturmak çok kolaydır. Öncelikle bir veritabanı oluşturalım.

  1. MongoDB için Azure Cosmos DB hesabı sol menüsünde Veri Gezgini'ni seçin.

  2. Yeni Koleksiyon simgesinin sağındaki açılan menüden Yeni Veritabanı'nı seçin.

  3. Veritabanı kimliği metin kutusunun altında veritabanınıza yeni bir ad verin.

  4. Yeni Veritabanı iletişim kutusunda Sağlama aktarım hızını tanımlayabiliriz ancak çoğu durumda sağlanan aktarım hızınızı kapsayıcı düzeyinde seçebilirsiniz. Aktarım hızı sağla onay kutusunun işaretini kaldıralım ve bu örnek için Tamam'ı seçelim.

    Şimdi MONGO API'sinin altında yeni veritabanımızı fark etmeliyiz. Yeni koleksiyonumuzu oluşturmanın zamanı geldi.

  5. Yeni Koleksiyon simgesini seçin.

  6. Yeni Koleksiyon iletişim kutusunun altına aşağıdaki parametreleri girin.

    • Veritabanı adı - Burada yeni oluştur veya Var olanı kullan olmak üzere iki seçeneğiniz olduğunu fark edeceksiniz. Bu seçenek, yeni koleksiyonu oluştururken yeni bir veritabanı oluşturmanıza olanak tanır. Önceki adımlarda zaten yeni bir veritabanı oluşturduğumuzdan Var olanı kullan'ı seçin ve açılan seçeneklerden veritabanı adını seçin.
    • Koleksiyon kimliği - Bu parametre, koleksiyonunuz için verdiğiniz addır.
    • Parçalama - Genellikle Parçalı'yı tercih ederiz. Bu seçenek, Azure Cosmos DB'nin Parça anahtarına göre birden çok kiracı arasında bölümlenmiş kapsayıcılar oluşturmasına olanak tanır. Büyük kapsayıcılarla Azure Cosmos DB, yüksek düzeyde ölçek elde etmek için kiracılarınızı birden çok fiziksel düğüme yayar. Parçalama konusunu Tasarım modülü altında daha ayrıntılı olarak ele alacağız. Parçalanmış'ı seçin.
      • Parça anahtarı - Parçalı seçmek için bir parça anahtarı eklemeniz gerekir. Bu anahtar, bölümleme stratejinizi tanımlayan bölüm anahtarıdır. Örneğin ve IoT (Nesnelerin İnterneti) koleksiyonunda seçtiğiniz bölümleme stratejisine bağlı olarak /deviceid veya belki /region olabilir. Bölümleme stratejisini Tasarım modülü altında daha ayrıntılı olarak ele alacağız.
      • Bu koleksiyon için ayrılmış aktarım hızı sağlama onay kutusu - Genellikle koleksiyonunuzun aktarım hızını Otomatik Ölçeklendirme veya El ile olarak sağlamak istersiniz. Bu ayar, bireysel koleksiyonunuzun maliyeti üzerinde daha iyi denetim sahibi olmanıza olanak tanır. Aktarım hızını Tasarım modülünde daha ayrıntılı olarak ele alacağız. Şimdilik onay kutusunu işaretleyin ve Otomatik Ölçeklendirme'yi seçin.
      • Koleksiyon aktarım hızı veya Koleksiyon Maksimum RU/sn - El ile veya Otomatik Ölçeklendirme'yi seçtiyseniz sırasıyla Koleksiyon aktarım hızını veya Koleksiyon Maksimum RU/sn'yi veya başka bir deyişle aktarım hızı modunu girmeniz gerekir. Aralarındaki temel fark , El ile modunda, kullansanız da kullanmasanız da seçtiğiniz RU/sn miktarının size yansıtılmamasıdır. Otomatik ölçeklendirme yalnızca seçtiğiniz Maksimum RU/sn'ye kadar kullandığınız kadar ücretlendirilir. Her iki durumda da, aktarım hızı seçilen değere ulaştığında koleksiyonunuz azaltmaya başlar. Bu örnek için önceden tanımlanmış değeri bırakın.
      • Analiz Deposu - Azure Cosmos DB analiz deposu bu derslerin kapsamının dışındadır. Bu konu hakkında daha fazla bilgi için Azure Cosmos DB analiz deposu nedir ? makalesini gözden geçirin.
      • Gelişmiş/Dizin Oluşturma - Tasarım modülü altında dizinleri daha ayrıntılı olarak ele alacağız. Onay kutusunu işaretli bırakın.

Şimdi bağlanacak bir veritabanımız ve bir koleksiyonumuz olmalıdır. Sonraki ünitede MongoDB için Azure Cosmos DB hesabına bağlanma hakkında daha ayrıntılı bilgi edineceğiz. Bundan önce MongoDB veritabanları ve koleksiyonları için Azure Cosmos DB oluşturmanın başka bir yolunu gözden geçirelim.

MongoDB için Azure Cosmos DB için veritabanı ve koleksiyon oluşturma veya koleksiyona bağlanma

MongoDB sürücüsüyle Java, Python, Node.js, .NET veya başka bir programlama dilini kullanarak MongoDB için Azure Cosmos DB hesabınızı oluşturabilmeniz veya buna bağlanabilmeniz gerekir. Şimdi farklı dillerden bazılarını kullanarak bu öğeleri oluşturmak için kullanabileceğiniz bazı işlevleri tanıtalım. Bu modülün başında geliştiricilerin, Azure Cosmos DB'ye bağlanmak ve uygulama oluşturmak için tanıdıkları MongoDB sürücülerini, SDK'larını ve araçlarını kullanmaya devam yapabileceklerini belirttik. Erişimimizi ve işlemlerimizi MongoDB için Azure Cosmos DB hesabımızla programlamak için bu sürücüleri ve bunların özelliklerini ve yöntemlerini kullanırız.

MongoDB için Azure Cosmos DB veritabanı oluşturma veya veritabanına bağlanma

MongoDB için Azure Cosmos DB uygulamanızı oluşturmak için en sevdiğiniz geliştirme aracını kullanabilirsiniz. Veritabanlarımızı ve koleksiyonlarımızı oluşturmak için ilgili her programlama dili için MongoDB sürücüsünü kullanırız. MongoDB hesapları için Azure Cosmos DB'ye bağlanma ve ürün veritabanına bağlanma kodunu gözden geçirelim.

Node.js

import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { MongoClient, ObjectId } = require('mongodb');
import axios from "axios";

async function main() {
  // Environment variables
  const endpoint = process.env.AZURE_COSMOS_RESOURCEENDPOINT;
  const listConnectionStringUrl = process.env.AZURE_COSMOS_LISTCONNECTIONSTRINGURL;
  const scope = process.env.AZURE_COSMOS_SCOPE;

  // Uncomment the corresponding lines for the authentication type you want to use.
  // For system-assigned managed identity.
  // const credential = new DefaultAzureCredential();

  // For user-assigned managed identity.
  // const clientId = process.env.AZURE_COSMOS_CLIENTID;
  // const credential = new DefaultAzureCredential({
  //     managedIdentityClientId: clientId
  // });

  // For service principal.
  // const tenantId = process.env.AZURE_COSMOS_TENANTID;
  // const clientId = process.env.AZURE_COSMOS_CLIENTID;
  // const clientSecret = process.env.AZURE_COSMOS_CLIENTSECRET;
  // const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);

  // Acquire the access token
  const accessToken = await credential.getToken(scope);

  // Get the connection string
  const config = {
    method: 'post',
    url: listConnectionStringUrl,
    headers: {
        'Authorization': 'Bearer ${accessToken.token}'
    }
  };
  const response = await axios(config);
  const keysDict = response.data;
  const connectionString = keysDict['connectionStrings'][0]['connectionString'];

  // Connect to Azure Cosmos DB for MongoDB
  const client = new MongoClient(connectionString);

  try {
    // Open the connection
    await client.connect();

    // Connect to the database "products"
    const ProductDatabase = client.db('products');

    // Add code to connect to a collection and add an entry here
  } catch (err) {
    console.error("An error occurred:", err);
  } finally {
    // Close the connection
    await client.close();
  }
}

main().catch((err) => console.error("Unhandled error:", err));

Java

package com.fabrikam;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import javax.net.ssl.*;
import java.net.InetSocketAddress;
import com.azure.identity.*;
import com.azure.core.credential.*;
import java.net.http.*;
import java.net.URI;

public class App {
  public static void main(String[] args) {
    // Environment variables
    String endpoint = System.getenv("AZURE_COSMOS_RESOURCEENDPOINT");
    String listConnectionStringUrl = System.getenv("AZURE_COSMOS_LISTCONNECTIONSTRINGURL");
    String scope = System.getenv("AZURE_COSMOS_SCOPE");

    // Uncomment the corresponding lines for the authentication type you want to use.
    // For system-assigned managed identity.
    // DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();

    // For user-assigned managed identity.
    // DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder()
    //     .managedIdentityClientId(System.getenv("AZURE_COSMOS_CLIENTID"))
    //     .build();

    // For service principal.
    // ClientSecretCredential defaultCredential = new ClientSecretCredentialBuilder()
    //     .clientId(System.getenv("AZURE_COSMOS_CLIENTID"))
    //     .clientSecret(System.getenv("AZURE_COSMOS_CLIENTSECRET"))
    //     .tenantId(System.getenv("AZURE_COSMOS_TENANTID"))
    //     .build();

    MongoClient mongoClient = null;

    try {
      // Acquire the access token
      AccessToken accessToken = defaultCredential
          .getToken(new TokenRequestContext().addScopes(scope))
          .block();
      String token = accessToken.getToken();

      // Retrieve the connection string
      HttpClient client = HttpClient.newBuilder().build();
      HttpRequest request = HttpRequest.newBuilder()
          .uri(new URI(listConnectionStringUrl))
          .header("Authorization", "Bearer " + token)
          .POST(HttpRequest.BodyPublishers.noBody())
          .build();
      HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

      JSONParser parser = new JSONParser();
      JSONObject responseBody = parser.parse(response.body());
      List<Map<String, String>> connectionStrings = responseBody.get("connectionStrings");
      String connectionString = connectionStrings.get(0).get("connectionString");

      // Connect to Azure Cosmos DB for MongoDB
      MongoClientURI uri = new MongoClientURI(connectionString);
      mongoClient = new MongoClient(uri);

      // Connect to the database
      MongoDatabase ProductDatabase = mongoClient.getDatabase("products");

      // Add code to connect to a collection and add an entry here

    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (mongoClient != null) {
        mongoClient.close();
      }
    }
  }
}

Piton

import os
import pymongo
import requests
from azure.identity import ManagedIdentityCredential, ClientSecretCredential

# Environment variables
endpoint = os.getenv('AZURE_COSMOS_RESOURCEENDPOINT')
listConnectionStringUrl = os.getenv('AZURE_COSMOS_LISTCONNECTIONSTRINGURL')
scope = os.getenv('AZURE_COSMOS_SCOPE')

# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity
# cred = ManagedIdentityCredential()

# For user-assigned managed identity
# managed_identity_client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)

# For service principal
# tenant_id = os.getenv('AZURE_COSMOS_TENANTID')
# client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# client_secret = os.getenv('AZURE_COSMOS_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)

# Get the connection string
session = requests.Session()
token = cred.get_token(scope)
response = session.post(listConnectionStringUrl, headers={"Authorization": "Bearer {}".format(token.token)})
keys_dict = response.json()
conn_str = keys_dict["connectionStrings"][0]["connectionString"]

# Connect to Azure Cosmos DB for MongoDB
client = pymongo.MongoClient(conn_str)

# To connect to the database, use the connection variable ("client" in this case), and the database name
ProductDatabase = client["products"]

# Add code to connect to a collection and add an entry here

C#

using MongoDB.Driver;
using Azure.Identity;
using Azure.Core;
using System;
using System.Net.Http;
using System.Text.Json;
using System.Collections.Generic;
using System.Threading.Tasks;

public class Products
{
  public int ProductId { get; set; }
  public string name { get; set; }
}

class test
{
  public static async Task Main(string[] args)
  {
      // Environment variables
      var endpoint = Environment.GetEnvironmentVariable("AZURE_COSMOS_RESOURCEENDPOINT");
      var listConnectionStringUrl = Environment.GetEnvironmentVariable("AZURE_COSMOS_LISTCONNECTIONSTRINGURL");
      var scope = Environment.GetEnvironmentVariable("AZURE_COSMOS_SCOPE");

      // Uncomment the corresponding lines for the authentication type you want to use.
      // For system-assigned identity.
      // var tokenProvider = new DefaultAzureCredential();

      // For user-assigned identity.
      // var tokenProvider = new DefaultAzureCredential(
      //     new DefaultAzureCredentialOptions
      //     {
      //         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID")
      //     });

      // For service principal.
      // var tenantId = Environment.GetEnvironmentVariable("AZURE_COSMOS_TENANTID");
      // var clientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
      // var clientSecret = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTSECRET");
      // var tokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

      // Acquire the access token.
      AccessToken accessToken = await tokenProvider.GetTokenAsync(
          new TokenRequestContext(scopes: new[] { scope }));

      // Get the connection string.
      using var httpClient = new HttpClient();
      httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken.Token}");
      var response = await httpClient.PostAsync(listConnectionStringUrl, null);
      response.EnsureSuccessStatusCode();
      var responseBody = await response.Content.ReadAsStringAsync();

      // Parse the connection string.
      var connectionStrings = JsonSerializer.Deserialize<Dictionary<string, List<Dictionary<string, string>>>>(responseBody);
      string connectionString = connectionStrings["connectionStrings"][0]["connectionString"];

      // Initialize the MongoClient with the connection string.
      var mongoClient = new MongoClient(connectionString);

      // Connect to the "products" database.
      var ProductDatabase = mongoClient.GetDatabase("products");

      // Add code to connect to a collection and add an entry here.
  }
}

Bu basit bir işlemdir; sürücüyü kullanarak bağlandıktan sonra yeni bir veritabanı oluştururuz veya dile bağlı olarak GetDatabase veya benzer yöntemlerle var olan bir veritabanını işaret ederiz. Uygulamamız artık istenen veritabanına başvurmak için ProductDatabase değişkenini kullanabilir. Koleksiyon oluşturmak veya koleksiyona bağlanmak, yeni bir veritabanı oluşturmak kadar basittir.

MongoDB için Azure Cosmos DB için koleksiyon oluşturma

Mevcut bir koleksiyonu oluşturmak veya bunlara erişmek için programlama diline bağlı olarak bir koleksiyon alma yöntemi veya başvurusu kullanırız. Şimdi bir koleksiyon oluşturmak/koleksiyona bağlanmak için önceki örne kod ekleyelim ve bu koleksiyona bir giriş ekleyelim.

Node.js

          // Add code to connect to a collection and add and find an entry here 
          var collection = ProductDatabase.collection('documents');
          var insertResult = await collection.insertOne({ ProductId: 1, name: "bread" });

          // return data where ProductId = 1
          const findProduct = await collection.find({ProductId: 1});
          await findProduct.forEach(console.log);

Java

          // Add code to connect to a collection and add and find an entry here 
          MongoCollection collection = ProductDatabase.getCollection("products");

          collection.insertOne(new Document()
                      .append("ProductId", 1)
                      .append("name", "bread"));

          // return data where ProductId = 1
          Document findProduct = (Document) collection.find(eq("ProductId", 1)).first();
          System.out.println(findProduct.toJson());

Piton

# Add code to connect to a collection and add an entry here 
collection = ProductDatabase["products"]
collection.insert_one({ "ProductId": 1, "name": "bread" })

C#

    // Add code to connect to a collection and add an entry here 
    var ProductCollection = ProductDatabase.GetCollection<Products>("products");

    Products Product = new Products {ProductId=1,name="bread"};
    ProductCollection.InsertOne (Product);

Sonraki ünitede, bağlantı dizesi tam olarak nasıl oluşturduğumuzu göreceğiz.

MongoDB için Azure Cosmos DB API'sinde depolanan verileri yönetmek için MongoDB uzantısı komutlarını kullanma

Daha önce de bahsettiğimiz gibi MongoDB için Azure Cosmos DB, Azure Cosmos DB hesabımız için bir MongoDB sunucusunda nesnelerimize erişmek ve nesneleri oluşturmak için kullandığımız sürücüleri ve kodu kullanma olanağı sağlar. Ancak, veritabanlarımızı ve koleksiyonlarımızı oluşturmak için bu kodu kullanmak varsayılan Azure Cosmos DB oluşturma parametrelerini kullanır. Azure Cosmos DB özelliklerinden yararlanmak için aktarım hızı, otomatik ölçeklendirme, parça anahtarları atama ve dizinleri tanımlama gibi veritabanı ve koleksiyon oluşturma parametrelerimizi denetleyebilmemiz gerekir. MongoDB için Azure Cosmos DB, bu parametreleri tanımlamak için genişletilmiş komutları kullanarak bu özelliği sağlar. Bu komutlar, veritabanlarımızı ve koleksiyonlarımızı özellikle Azure Cosmos DB için oluşturma veya değiştirme konusunda daha kesin yönergeler kodlayabilmemizi sağlar.

MongoDB için Azure Cosmos DB, aşağıdaki istek türleri için uzantı komutları sağlar:

  • Veritabanı oluşturma
  • Veritabanını güncelleştirme
  • Veritabanı alma
  • Koleksiyon oluşturma
  • Koleksiyonu güncelleştirme
  • Koleksiyon alma

MongoDB sürücüleri, genişletilmiş komutlarımızı Azure Cosmos DB'ye göndermek için bu işlevi kullandığımız bir veritabanında komut çalıştırmak için bir işlev sağlar. Şimdi 2000 RU (İstek Birimleri) aktarım hızına ve DeviceId'nin parça anahtarına sahip bir IoT Cihazı koleksiyonu oluşturmak için koda göz atalım.

Node.js

    // create the Devices collection with a throughput of 2000 RUs and with DeviceId as the sharding key
    var result = IOTDatabase.command({customAction: "CreateCollection", collection: "Devices", offerThroughput: 2000, shardKey: "DeviceId"});

Java

      // create the Devices collection with a throughput of 2000 RUs and with DeviceId as the sharding key
      Document DevCollectionDef = new Document();
      DevCollectionDef.append("customAction", "CreateCollection");
      DevCollectionDef.append("collection", "Devices");
      DevCollectionDef.append("offerThroughput", 2000);
      DevCollectionDef.append("shardKey", "DeviceId");

      Document result = IOTDatabase.runCommand(DevCollectionDef);

Piton

      # create the Devices collection with a throughput of 2000 RUs and with DeviceId as the sharding key
      IOTDatabase.command({'customAction': "CreateCollection", 'collection': "Devices", 'offerThroughput': 2000, 'shardKey': "DeviceId"})

C#

      // create the Devices collection with a throughput of 1000 RUs and with EmployeeId as the sharding key
      var result = IOTDatabase.RunCommand<BsonDocument>(@"{customAction: ""CreateCollection"", collection: ""Devices"", offerThroughput: 2000, shardKey: ""DeviceId""}");

Benzer şekilde, bir koleksiyonu değiştirebilir veya veritabanı oluşturabilir veya değiştirebiliriz. MongoDB için Azure Cosmos DB API'sinde depolanan verileri yönetmek amacıyla MongoDB uzantısı komutlarını kullanma makalesini inceleyin. Daha fazla bilgi için.