DocumentDB 从另一个存储过程或自身调用存储过程
DocumentDB call stored procedure from another stored procedure or itself
有没有一种方法可以针对 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 是否支持从另一个存储过程调用一个存储过程?存储过程可以调用自身吗?
我在网上找到了一些 DocumentDB 存储过程参考资料,包括 this and this and this and this 以及许多其他页面。
如果可能的话,我想我可能必须以某种方式查询集合以获取我想要调用的存储过程,然后以某种方式引用存储过程,而不是像您那样直接调用 sumTotals()
一种独立的语言。
我们刚刚开始研究使用 DocumentDB 进行编程,因此我们还不完全确定我们可以用它做什么。感谢您的任何帮助或建议。
我认为你的方向是正确的。
无法从存储过程中执行存储过程。
但是,您可以在存储过程中定义 JS 函数,可以在该存储过程中引用、调用和重新使用这些函数。
在这种情况下,只需在父 sumAllValues()
存储过程中定义 sumValues()
函数(就像您提到的 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。
有没有一种方法可以针对 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 是否支持从另一个存储过程调用一个存储过程?存储过程可以调用自身吗?
我在网上找到了一些 DocumentDB 存储过程参考资料,包括 this and this and this and this 以及许多其他页面。
如果可能的话,我想我可能必须以某种方式查询集合以获取我想要调用的存储过程,然后以某种方式引用存储过程,而不是像您那样直接调用 sumTotals()
一种独立的语言。
我们刚刚开始研究使用 DocumentDB 进行编程,因此我们还不完全确定我们可以用它做什么。感谢您的任何帮助或建议。
我认为你的方向是正确的。
无法从存储过程中执行存储过程。
但是,您可以在存储过程中定义 JS 函数,可以在该存储过程中引用、调用和重新使用这些函数。
在这种情况下,只需在父 sumAllValues()
存储过程中定义 sumValues()
函数(就像您提到的 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。