JavaScript için Azure SDK'sını kullanarak NoSQL için Azure Cosmos DB'de toplu işlemler gerçekleştirme

Bu kılavuzda, NoSQL için Azure Cosmos DB'de toplu oluşturma ve güncelleştirme işlemleri gerçekleştirmek için JavaScript için Azure SDK'daki özelliği kullanın executeBulkOperations . Bu özellik bölüm başına eşzamanlılığı ayarlar, her bir işlem için yeniden deneme mantığını otomatik olarak işler ve büyük miktarlarda (100+) işlem gerçekleştirir. Bu özellik, çağrıların azaltma olmadan başarılı olduğu durumlarda eşzamanlılığı otomatik olarak artırır ve kısıtlama gerçekleştiğinde ölçeği geri çeker.

Prerequisites

  • Mevcut bir NoSQL için Azure Cosmos DB hesabı

  • Node.js 22.x veya üzeri

Geliştirme ortamınızı başlatma

İlk proje ve tüm geliştirici bağımlılıkları ile bir geliştirme ortamı oluşturarak başlayın. Bu proje için @azure/cosmos bileşenini, bir geliştirme bağımlılığı olarak yükleyeceksiniz.

  1. Boş bir klasörde bir terminal açın.

  2. Yeni bir Node.js projesi başlatın.

    npm init
    
  3. Yeni oluşturulan package.json dosyanızı bu içerikle güncelleştirin.

    {
      "main": "app.js",
      "scripts": {
        "start": "node app.js"
      }
    }
    
  4. Node Paket Yöneticisi'dan (npm) @azure/cosmos paketini yükleyin.

    npm install --save @azure/cosmos
    

    Important

    Toplu yürütme özelliği, JavaScript için Azure SDK'da kitaplığın @azure/cosmos 4.3 veya sonraki sürümlerinde kullanılabilir. SDK'nın eski bir sürümünü kullanıyorsanız, bu özellikleri kullanmak için daha yeni bir sürüme geçmeniz gerekir.

Bağlantınızı ve kaynaklarınızı yapılandırma

Şimdi yüklü paketi kullanarak mevcut bir NoSQL için Azure Cosmos DB hesabına bağlantınızı yapılandırın.

  1. CosmosClient türünü ve BulkOperationType ve PatchOperationType destekleyici türlerini içeri aktarın.

    const { BulkOperationType, PatchOperationType, CosmosClient } = require('@azure/cosmos');
    
  2. Hesabınız için uygun kimlik bilgilerini geçirerek CosmosClient sınıfının yeni bir örneğini oluşturun.

    const client = new CosmosClient({
        endpoint: '<azure-cosmos-db-nosql-account-endpoint>',
        credential
    });
    
  3. Mevcut veritabanınıza ve kapsayıcı kaynaklarınıza yönelik işaretçiler için sabitler oluşturun.

    const database = client.database('<database-name>');
    
    const container = database.container('<container-name>');
    

Çoklu upsert işlemini toplu olarak oluşturma

İki öğeyi yukarı yükleyen bir toplu işlem gerçekleştirerek başlayın. Her iki öğe de bir öğeler dizisi içinde OperationInput oluşturulmuştur. Upsert ve Create işlemleri en azından benzersiz tanımlayıcıyı (id) ve bölüm anahtarı alanlarını içermelidir.

Note

Bu örnekte bölüm anahtarı alanıdır /category .

  1. Kapsayıcıya yukarı eklemek üzere öğeler için iki sabit oluşturun.

    const yambdaSurfboard = {
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        category: 'gear-surf-surfboards',
        name: 'Yamba Surfboard',
        quantity: 12,
        price: 850.0,
        clearance: false
    };
    
    const kiamaClassicSurfboard = {
        id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        category: 'gear-surf-surfboards',
        name: 'Kiama Classic Surfboard',
        quantity: 25,
        price: 790.0,
        clearance: true
    };
    
  2. Upsert işlemini her iki öğe için de kullanarak bir işlem dizisi oluşturun. partitionKey özelliğini ve öğenin kendisini resourceBody özelliğinde açıkça belirtin.

    const upsertOperations = [
        {
            operationType: BulkOperationType.Upsert,
            partitionKey: 'gear-surf-surfboards',
            resourceBody: yambdaSurfboard
        },
        {
            operationType: BulkOperationType.Upsert,
            partitionKey: 'gear-surf-surfboards',
            resourceBody: kiamaClassicSurfboard
        }
    ];
    

Toplu işlem yanıtını ayrıştırın

Komutunu çalıştırın ve ardından toplu işlemden yanıtı gözden geçirin. Yanıt, her işlemle ilgili meta veriler içerir.

  1. Kapsayıcınızın executeBulkOperations özelliğindeki items yöntemini kullanarak işlemleri toplu olarak gerçekleştirin.

    const response = await container.items.executeBulkOperations(upsertOperations);
    
    console.log(response);
    
  2. Yanıt nesnesini ayrıştırın. Yanıt, başarılı işlemler için bir durum kodu ve response nesnesi içerir. Başarısız işlemler bunun yerine bir error nesne içerir.

    npm run start
    

    Note

    Yanıt yükünün boyutunu en aza indirmek için contentResponseOnWriteEnabled değerini false olarak ayarlayın. Bu bayrak, SDK'daki toplu ve yığın özelliklerine özgüdür.

    [
      {
        operationInput: {
          operationType: 'Upsert',
          id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
          partitionKey: 'gear-surf-surfboards',
          resourceBody: { ... }
        },
        response: {
          statusCode: 201,
          eTag: '...',
          activityId: '...',
          requestCharge: 7.23,
          resourceBody: { ... },
          diagnostics: { ... },
          headers: { ... }
        }
      },
      ...
    ]
    

Daha fazla toplu işlem gerçekleştirme

İsteğe bağlı olarak, , Readve Deletegibi Patchdiğer işlemleri gerçekleştirebilirsiniz. Bu bölümde kullanılan tüm işlemler bölüm anahtarı alanını içermelidir.

Tip

Create ve Upsert işlemleri hem hem de idbölüm anahtarı alanlarını gerektirir. Kalan işlemler , ReadDelete, , Replaceve Patch yalnızca bölüm anahtarı alanını gerektirir. Gerekli alanlar belirtilmezse işlem başarısız olur.

const variousOperations = [
    {
        operationType: BulkOperationType.Read,
        id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        partitionKey: 'gear-surf-surfboards',
    },
    {
        operationType: BulkOperationType.Delete,
        id: 'bbbbbbbb-1111-2222-3333-cccccccccccc',
        partitionKey: 'gear-surf-surfboards',
    },
    {
        operationType: BulkOperationType.Patch,
        id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
        partitionKey: 'gear-surf-surfboards',
        resourceBody: {
            operations: [
                {
                    op: PatchOperationType.add,
                    path: '/onSale',
                    value: true
                }
            ],
        },
    }
]

const response = await container.items.executeBulkOperations(upsertOperations);