Cara menulis prosedur tersimpan dan pemicu di Azure Cosmos DB dengan menggunakan API kueri JavaScript

BERLAKU UNTUK: NoSQL

Azure Cosmos DB memungkinkan Anda untuk melakukan kueri yang dioptimalkan dengan menggunakan antarmuka JavaScript yang fasih tanpa pengetahuan bahasa SQL yang dapat digunakan untuk menulis prosedur tersimpan atau pemicu. Untuk mempelajari selengkapnya tentang dukungan JavaScript Query API di Azure Cosmos DB, lihat Bekerja dengan API kueri terintegrasi bahasa JavaScript di artikel Azure Cosmos DB.

Prosedur tersimpan menggunakan API kueri JavaScript

Contoh kode berikut adalah contoh bagaimana API kueri JavaScript digunakan dalam konteks prosedur tersimpan. Prosedur tersimpan menyisipkan item Azure Cosmos DB yang ditentukan oleh parameter input, dan memperbarui dokumen metadata dengan menggunakan __.filter() metode , dengan minSize, maxSize, dan totalSize berdasarkan properti ukuran item input.

Catatan

__ (garis bawah ganda) adalah sebuah alias saat getContext().getCollection() menggunakan API kueri JavaScript.

/**
 * Insert an item and update metadata doc: minSize, maxSize, totalSize based on item.size.
 */
function insertDocumentAndUpdateMetadata(item) {
  // HTTP error codes sent to our callback function by CosmosDB server.
  var ErrorCode = {
    RETRY_WITH: 449,
  }

  var isAccepted = __.createDocument(__.getSelfLink(), item, {}, function(err, item, options) {
    if (err) throw err;

    // Check the item (ignore items with invalid/zero size and metadata itself) and call updateMetadata.
    if (!item.isMetadata && item.size > 0) {
      // Get the metadata. We keep it in the same container. it's the only item that has .isMetadata = true.
      var result = __.filter(function(x) {
        return x.isMetadata === true
      }, function(err, feed, options) {
        if (err) throw err;

        // We assume that metadata item was pre-created and must exist when this script is called.
        if (!feed || !feed.length) throw new Error("Failed to find the metadata item.");

        // The metadata item.
        var metaItem = feed[0];

        // Update metaDoc.minSize:
        // for 1st document use doc.Size, for all the rest see if it's less than last min.
        if (metaItem.minSize == 0) metaItem.minSize = item.size;
        else metaItem.minSize = Math.min(metaItem.minSize, item.size);

        // Update metaItem.maxSize.
        metaItem.maxSize = Math.max(metaItem.maxSize, item.size);

        // Update metaItem.totalSize.
        metaItem.totalSize += item.size;

        // Update/replace the metadata item in the store.
        var isAccepted = __.replaceDocument(metaItem._self, metaItem, function(err) {
          if (err) throw err;
          // Note: in case concurrent updates causes conflict with ErrorCode.RETRY_WITH, we can't read the meta again
          //       and update again because due to Snapshot isolation we will read same exact version (we are in same transaction).
          //       We have to take care of that on the client side.
        });
        if (!isAccepted) throw new Error("replaceDocument(metaItem) returned false.");
      });
      if (!result.isAccepted) throw new Error("filter for metaItem returned false.");
    }
  });
  if (!isAccepted) throw new Error("createDocument(actual item) returned false.");
}

Langkah berikutnya

Lihat artikel berikut ini untuk mempelajari tentang prosedur tersimpan, pemicu, dan fungsi yang ditentukan pengguna di Azure Cosmos DB: