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