首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个存储过程或其本身调用DocumentDB存储过程

问从另一个存储过程或其本身调用DocumentDB存储过程
EN

Stack Overflow用户
提问于 2015-03-17 19:03:14
回答 1查看 1.2K关注 0票数 6

有没有一种方法可以针对DocumentDB文档递归地调用存储过程(如果这样的话甚至调用UDF)?

我们有一份类似这样的文件:

代码语言:javascript
复制
{
  "docID" : "my_id",
  "owner" : "fred",
  "items" : [
    {
      "itemID" : "1",
      "type" : "item",
      "value" : 3
    },
    {
      "itemID" : "2",
      "type" : "group",
      "items" : [
        {
          "itemID" : "2.1",
          "type" : "group",
          "items" : [
            {
              "itemID" : "2.1.1",
              "type" : "item",
              "value" : 2
            },
            {
              "itemID" : "2.1.2",
              "type" : "item",
              "value" : 4
            }
          ]
        },
        {
          "itemID" : "2.2",
          "type" : "item",
          "value" : 1
        }
      ]
    }
  ]
}

只要我们有"items","items"数组就可以包含"type" : "item"和"type" : "group"混合的条目。属于"type" : "item"的条目有一个简单的需要求和的"value"字段。属于"type" : "group"的条目有一个"items"数组..。诸若此类。理论上,递归的级别是没有限制的,我承认这是一个问题,但在实践中,递归的程度很少低于4或5。

我试图写的伪代码如下所示:

代码语言:javascript
复制
function sumValues(items) {
    int total = 0;
    forEach(item in items) {
        if (item.type == "item") {
            total += item.value;
        } else {
            total += sumValues(item.items);
        }
    }
    return total;
}

function sumAllValues() {
  var ctx = getContext();
  var coll = ctx.getCollection();
  var response = ctx.getResponse();

  // query for docs by owner
  var filterQuery = 'SELECT * FROM Docs d where d.owner = \\\"fred\\\"';
  var done = coll.queryDocuments(coll.getSelfLink(), filterQuery, {},
    function (err, docs, options) {
      if (err) throw new Error ('Error' + err.message);

      var total = 0;
      docs.forEach(function(doc) {
        total += sumTotals(doc.items);
      });

      response.setBody('Total: ' + total);
    });
}

这有可能吗?DocumentDB支持从另一个sproc调用sproc吗?sproc能自称为自己吗?

我在网上找到了一些DocumentDB存储过程引用,包括this和this、this和this以及许多其他页面。

如果可能的话,我想我可能不得不以某种方式查询集合以获得我想要调用的sproc,然后以某种方式引用sproc,而不是像使用独立语言那样直接调用sumTotals()。

我们刚刚开始研究用DocumentDB编程,所以我们还不能完全确定我们能用它做什么。感谢您的帮助和建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-18 16:58:50

我觉得你走的路很对。

不可能在存储过程中执行存储过程。

但是,可以在存储过程中定义JS函数,可以从该存储过程中引用、调用和重用JS函数。

在本例中,只需在父sumValues()存储过程中定义您的sumAllValues()函数(就像您提到的swapItems()示例)。

代码语言:javascript
复制
function sumAllValues() {
    var ctx = getContext();
    var coll = ctx.getCollection();
    var response = ctx.getResponse();

    // query for docs by owner
    var filterQuery = 'SELECT * FROM Docs d where d.owner = \\\"fred\\\"';
    var done = coll.queryDocuments(coll.getSelfLink(), filterQuery, {},
        function (err, docs, options) {
            if (err) throw new Error ('Error' + err.message);

            var total = 0;
            docs.forEach(function(doc) {
                total += sumValues(doc.items);
            });

            response.setBody('Total: ' + total);
        });

    function sumValues(items) {
        int total = 0;
        items.forEach(function(item) {
            if (item.type == "item") {
                total += item.value;
            } else {
                total += sumValues(item.items);
            }
        });
        return total;
    }
}

您还可以为希望在多个存储过程和查询之间共享和重用的逻辑定义UDF。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29107576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档