كيفية كتابة الإجراءات والمشغلات المخزنة باستخدام واجهة برمجة تطبيقات استعلام JavaScript في Azure Cosmos DB

ينطبق على: NoSQL

يسمح لك Azure Cosmos DB بإجراء استعلامات محسّنة باستخدام واجهة JavaScript بطلاقة دون أي معرفة بلغة SQL التي يمكن استخدامها لكتابة الإجراءات المخزنة أو المشغلات. لمعرفة المزيد حول دعم API لاستعلام JavaScript في Azure Cosmos DB، راجع مقالةالعمل باستخدام واجهة برمجة تطبيقات الاستعلام المتكامل بلغة JavaScript في Azure Cosmos DB.

الإجراء المخزّن باستخدام واجهة API استعلام JavaScript

نموذج التعليمات البرمجية التالي هو مثال على كيفية استخدام API استعلام JavaScript في سياق إجراء مخزن. يدرج الإجراء المخزن عنصر Azure Cosmos DB المحدد بواسطة معلمة إدخال، ويحدث مستند بيانات التعريف باستخدام __.filter() الأسلوب ، مع minSize وmaxSize و totalSize استنادا إلى خاصية حجم عنصر الإدخال.

إشعار

__ (شرطة سفلية مزدوجة) هي اسم مستعار لـ getContext().getCollection() عند استخدام API استعلام 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.");
}

الخطوات التالية

تتبع المقالات التالية للتعرف على الإجراءات المخزنة والمشغلات والوظائف المعرفة من قبل المستخدم في Azure Cosmos DB: