Como escrever procedimentos armazenados e gatilhos no Azure Cosmos DB usando a API de consulta do JavaScript

APLICA-SE A: NoSQL

O Azure Cosmos DB permite que você execute consultas otimizadas usando uma interface fluente do JavaScript sem nenhum conhecimento da linguagem SQL que pode ser usada para escrever procedimentos armazenados ou gatilhos. Para saber mais sobre o suporte à API de Consulta do JavaScript no Azure Cosmos DB, confira o artigo Trabalhando com a API de consulta integrada da linguagem JavaScript no Azure Cosmos DB.

Procedimento armazenado usando a API de consulta do JavaScript

O exemplo de código a seguir mostra como a API de consulta JavaScript é usada no contexto de um procedimento armazenado. O procedimento armazenado insere um item do Azure Cosmos DB especificado por um parâmetro de entrada e atualiza um documento de metadados usando o método __.filter(), com minSize, maxSize e totalSize com base na propriedade de tamanho do item de entrada.

Observação

__ (sublinhado duplo) é um alias para getContext().getCollection() ao usar a API de consulta do 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.");
}

Próximas etapas

Confira os seguintes artigos para saber mais sobre procedimentos armazenados, gatilhos e funções definidas pelo usuário no Azure Cosmos DB: