有没有一种方法可以针对 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"
数组就可以包含混合"type" : "item"
和的条目"type" : "group"
。的条目有一个需要求和"type" : "item"
的简单字段。具有数组"value"
的条目......等等。理论上,递归的级别没有限制,我承认这是一个问题,但在实践中,级别很少会低于 4 或 5 深。"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 存储过程参考,包括this和this以及this和this以及许多其他页面。
如果可能的话,我想我可能不得不以某种方式查询集合以获取我想要调用的存储过程,然后以某种方式引用存储过程,而不是sumTotals()
像使用独立语言那样直接调用。
我们刚刚开始研究使用 DocumentDB 进行编程,所以我们还不能完全确定我们可以用它做什么。感谢您提供任何帮助或建议。