Cosmos DB 存储过程、UDF 和可重用代码 - 它们如何组合在一起?
Cosmos DB Stored Procedures, UDF & reuseable code - how do they fit together?
我有很多问题:)
我已经开始使用 Cosmos DB (SQL API)。好喜欢!
但我正在努力寻找构建和管理代码的最佳方式。我正在使用 Visual Studio.
这是一些代码,我的问题将基于这 4 个 javascript 函数:
function createYayBase(something) {
// UDF
return {
pk: "Yay",
id: "Ptr=" + something
};
}
function createYayDoc(whatever, something) {
// UDF
var o = createYayBase(something);
o.Message = whatever;
return o;
}
function validateYayDoc(doc) {
// UDF
if (doc.pk !== "Yay") { throw new Error("non-Yay! :("); }
}
function processYay(val) {
// stored procedure
var doc = CreateYayDoc(val, "Rec");
validateYayDoc(doc);
...createDocument(selflink, doc, ...);
}
这 4 个函数在我的解决方案中的 4 个不同的 .js 文件中。我会在我的集合中将前 3 个部署为它们自己的用户定义函数。最后,我将部署为存储过程。
我的应用程序会执行 "processYay" 存储过程来执行一些操作。 UDF 是支持的。
问题:
- 我可以直接从存储过程调用 UDF,就像我在 "processYay" 中所做的那样吗?或者它们只能作为查询的一部分访问?
- 我可以从另一个 UDF 调用一个 UDF,就像我在 "createYayDoc" 中所做的那样吗?
- UDF 可以 'throw' 或者在这种情况下被认为是副作用吗?
如果答案是 "nope"、"nope" 和 "nope",似乎还有另一种解决方案:在存储过程本身内部定义函数。它会像这样完美地工作:
function processYay(val) {
// stored procedure
function createYayBase(something) { ... }
function createYayDoc(whatever, something) { ... }
function validateYayDoc(val) { ... }
var doc = CreateYayDoc(val, "Rec");
validateYayDoc(doc);
...createDocument(selflink, doc, ...);
}
但是后来...
如何重用代码?
我的 javascript 位于 .NET class 库中。我喜欢“#include”技巧 :)。我会用 webpack 等破解一些东西吗?
或者...是否有一些人们使用的可接受的方法?
1.Can I call a UDF from a stored procedure directly, similar to how I've done it above in "processYay"? Or are they only accessible as
part of a query?
2.Can I call a UDF from another UDF, as I did inside "createYayDoc"?
3.Can a UDF 'throw' or is that considered a side effect in this case?
答案是nope.You可以在官方UDF中找到如下明确的说法doc。
User-defined functions (UDFs) are used to extend the Azure Cosmos DB
SQL query language grammar and implement custom business logic. They
can only be called from inside queries. They do not have access to the
context object and are meant to be used as compute-only JavaScript.
Therefore, UDFs can be run on secondary replicas of the Cosmos DB
service.
我觉得你对user defined function
的应用场景有一些误解。它只是帮助您根据自定义业务逻辑处理查询的结果集。不能被存储过程调用,不能调用其他方法,甚至不能操作数据库。
存储过程只是在服务器运行上side.It的JS代码脚本,可以帮助您进行一些自定义的数据库操作,甚至是批量操作。讲的是特殊需求,让你想不到它是一个完整项目中的一个普通功能。
考虑到复用性,可以将JS代码中的一些关键变量作为参数传递给存储过程
希望对你有帮助。
我有很多问题:)
我已经开始使用 Cosmos DB (SQL API)。好喜欢!
但我正在努力寻找构建和管理代码的最佳方式。我正在使用 Visual Studio.
这是一些代码,我的问题将基于这 4 个 javascript 函数:
function createYayBase(something) {
// UDF
return {
pk: "Yay",
id: "Ptr=" + something
};
}
function createYayDoc(whatever, something) {
// UDF
var o = createYayBase(something);
o.Message = whatever;
return o;
}
function validateYayDoc(doc) {
// UDF
if (doc.pk !== "Yay") { throw new Error("non-Yay! :("); }
}
function processYay(val) {
// stored procedure
var doc = CreateYayDoc(val, "Rec");
validateYayDoc(doc);
...createDocument(selflink, doc, ...);
}
这 4 个函数在我的解决方案中的 4 个不同的 .js 文件中。我会在我的集合中将前 3 个部署为它们自己的用户定义函数。最后,我将部署为存储过程。
我的应用程序会执行 "processYay" 存储过程来执行一些操作。 UDF 是支持的。
问题:
- 我可以直接从存储过程调用 UDF,就像我在 "processYay" 中所做的那样吗?或者它们只能作为查询的一部分访问?
- 我可以从另一个 UDF 调用一个 UDF,就像我在 "createYayDoc" 中所做的那样吗?
- UDF 可以 'throw' 或者在这种情况下被认为是副作用吗?
如果答案是 "nope"、"nope" 和 "nope",似乎还有另一种解决方案:在存储过程本身内部定义函数。它会像这样完美地工作:
function processYay(val) {
// stored procedure
function createYayBase(something) { ... }
function createYayDoc(whatever, something) { ... }
function validateYayDoc(val) { ... }
var doc = CreateYayDoc(val, "Rec");
validateYayDoc(doc);
...createDocument(selflink, doc, ...);
}
但是后来...
如何重用代码?
我的 javascript 位于 .NET class 库中。我喜欢“#include”技巧 :)。我会用 webpack 等破解一些东西吗?
或者...是否有一些人们使用的可接受的方法?
1.Can I call a UDF from a stored procedure directly, similar to how I've done it above in "processYay"? Or are they only accessible as part of a query?
2.Can I call a UDF from another UDF, as I did inside "createYayDoc"?
3.Can a UDF 'throw' or is that considered a side effect in this case?
答案是nope.You可以在官方UDF中找到如下明确的说法doc。
User-defined functions (UDFs) are used to extend the Azure Cosmos DB SQL query language grammar and implement custom business logic. They can only be called from inside queries. They do not have access to the context object and are meant to be used as compute-only JavaScript. Therefore, UDFs can be run on secondary replicas of the Cosmos DB service.
我觉得你对user defined function
的应用场景有一些误解。它只是帮助您根据自定义业务逻辑处理查询的结果集。不能被存储过程调用,不能调用其他方法,甚至不能操作数据库。
存储过程只是在服务器运行上side.It的JS代码脚本,可以帮助您进行一些自定义的数据库操作,甚至是批量操作。讲的是特殊需求,让你想不到它是一个完整项目中的一个普通功能。
考虑到复用性,可以将JS代码中的一些关键变量作为参数传递给存储过程
希望对你有帮助。