Compartir vía


Escritura de procedimientos almacenados y desencadenadores en Azure Cosmos DB con la API de consulta de Javascript

SE APLICA A: NoSQL

Azure Cosmos DB permite realizar consultas optimizadas mediante una interfaz fluida de JavaScript sin ningún conocimiento del lenguaje de SQL que puede usarse para escribir procedimientos almacenados o desencadenadores. Para más información sobre la compatibilidad con la API de consulta de JavaScript en Azure Cosmos DB, consulte el artículo Working with JavaScript language integrated query API in Azure Cosmos DB (Trabajo con la API de consulta integrada de lenguaje de JavaScript en Azure Cosmos DB).

Procedimiento almacenado mediante la API de consulta de JavaScript

El ejemplo de código siguiente es un ejemplo de cómo se usa la API de consulta de JavaScript en el contexto de un procedimiento almacenado. El procedimiento almacenado inserta un elemento de Azure Cosmos DB proporcionado por un parámetro de entrada, y actualiza un documento de metadatos mediante el método __.filter(), con los valores minSize, maxSize y totalSize basados en la propiedad de tamaño del elemento de entrada.

Nota:

__ (subrayado doble) es un alias para getContext().getCollection() cuando se usa JavaScript Query API.

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

Pasos siguientes

Consulte los artículos siguientes para obtener información sobre procedimientos almacenados, desencadenadores y funciones definidas por el usuario en Azure Cosmos DB: