JavaScript sorgu API'sini kullanarak Azure Cosmos DB'de saklı yordamlar ve tetikleyiciler yazma

UYGULANANLAR: NOSQL

Azure Cosmos DB, saklı yordamları veya tetikleyicileri yazmak için kullanılabilecek SQL dili bilgisi olmadan akıcı bir JavaScript arabirimi kullanarak iyileştirilmiş sorgular gerçekleştirmenize olanak tanır. Azure Cosmos DB'de JavaScript Sorgu API'si desteği hakkında daha fazla bilgi edinmek için Azure Cosmos DB'de JavaScript diliyle tümleşik sorgu API'siyle çalışma makalesine bakın.

JavaScript sorgu API'sini kullanarak saklı yordam

Aşağıdaki kod örneği, JavaScript sorgu API'sinin saklı yordam bağlamında nasıl kullanıldığını gösteren bir örnektir. Saklı yordam, giriş parametresi tarafından belirtilen bir Azure Cosmos DB öğesi ekler ve giriş öğesinin size özelliğine göre minSize, maxSize ve totalSize ile yöntemini kullanarak __.filter() bir meta veri belgesini güncelleştirir.

Not

__ (çift alt çizgi), JavaScript sorgu API'sini getContext().getCollection() kullanırken kullanılan bir diğer addır.

/**
 * 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.");
}

Sonraki adımlar

Azure Cosmos DB'deki saklı yordamlar, tetikleyiciler ve kullanıcı tanımlı işlevler hakkında bilgi edinmek için aşağıdaki makalelere bakın: