gpt4 book ai didi

stored-procedures - DocumentDB 从另一个存储过程或自身调用存储过程

转载 作者:行者123 更新时间:2023-12-04 14:57:36 25 4
gpt4 key购买 nike

有没有办法针对 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存储过程引用,包括 thisthisthisthis加上许多其他页面。

如果可能的话,我想我可能必须以某种方式查询集合以获取我想要调用的 sproc,然后以某种方式引用该 sproc,而不是仅仅调用 sumTotals()就像使用独立语言一样直接。

我们刚刚开始研究使用 DocumentDB 进行编程,所以我们还不能完全确定我们可以用它做什么。感谢您的任何帮助或建议。

最佳答案

我认为你在这里走在正确的轨道上。

无法从存储过程中执行存储过程。

但是,您可以 在存储过程中定义 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。

关于stored-procedures - DocumentDB 从另一个存储过程或自身调用存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29107576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com