有没有一种方法可以针对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"字段。属于"type" : "group"的条目有一个"items"数组..。诸若此类。理论上,递归的级别是没有限制的,我承认这是一个问题,但在实践中,递归的程度很少低于4或5。
我试图写的伪代码如下所示:
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编程,所以我们还不能完全确定我们能用它做什么。感谢您的帮助和建议。
发布于 2015-03-18 16:58:50
我觉得你走的路很对。
不可能在存储过程中执行存储过程。
但是,可以在存储过程中定义JS函数,可以从该存储过程中引用、调用和重用JS函数。
在本例中,只需在父sumValues()存储过程中定义您的sumAllValues()函数(就像您提到的swapItems()示例)。
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。
https://stackoverflow.com/questions/29107576
复制相似问题