6

DocumentDB ドキュメントに対してストアド プロシージャ (またはそれが機能する場合は UDF) を再帰的に呼び出す方法はありますか?

次のようなドキュメントがあります。

{
  "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"が混在するエントリを含めることができます。のエントリには、合計する必要がある単純なフィールドがあります。配列を持つエントリ...など。理論的には、再帰のレベルに制限はありませんが、これが問題であることは認識していますが、実際には、レベルが 4 または 5 の深さを下回ることはめったにありません。"type" : "item""type" : "group""type" : "item""value""type" : "group""items"

私が書こうとしているものの擬似コードは次のようになります。

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 ストアド プロシージャ リファレンスをオンラインで見つけました。

sumTotals()可能であれば、スタンドアロン言語の場合のように直接呼び出すのではなく、何らかの方法でコレクションにクエリを実行して、呼び出したい sproc を取得し、何らかの方法で sproc を参照する必要があると思います。

DocumentDB を使用したプログラミングを検討し始めたばかりなので、何ができるかはまだ完全にはわかりません。助けやアドバイスをありがとう。

4

1 に答える 1