2

我有很多问题:)

我已经开始使用 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 是支持性的。

问题:

  1. 我可以直接从存储过程中调用 UDF,就像我在上面的“processYay”中所做的那样吗?或者它们只能作为查询的一部分访问?
  2. 我可以像在“createYayDoc”中那样从另一个 UDF 调用 UDF 吗?
  3. UDF 可以“抛出”还是在这种情况下被认为是副作用?

如果答案是“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 类库中。我喜欢“#include”技巧:)。我是否与 webpack 等一起破解某些东西?

或者......人们使用一些公认的方法吗?

4

1 回答 1

2

1.我可以直接从存储过程中调用UDF,类似于我在“processYay”中所做的那样吗?或者它们只能作为查询的一部分访问?

2.我可以像在“createYayDoc”中那样从另一个UDF调用UDF吗?

3.UDF 可以“抛出”还是在这种情况下被认为是副作用?

答案是否定的。您可以在官方 UDF文档中找到以下明确声明。

用户定义函数 (UDF) 用于扩展 Azure Cosmos DB SQL 查询语言语法并实现自定义业务逻辑。它们只能从内部查询中调用。它们无权访问上下文对象,只能用作计算 JavaScript。因此,UDF 可以在 Cosmos DB 服务的辅助副本上运行。

user defined function我想你对的应用场景有一些误解。它只是帮助您根据自定义业务逻辑处理查询的结果集。它不能被存储过程调用,不能调用其他方法,甚至不能操作数据库。

存储过程就是运行在服务器端的JS代码脚本,它可以帮助你做一些自定义的数据库操作,甚至是批量操作。它是关于特殊需求的,以至于你不能认为它是一个完整项目中的普通功能。

考虑到可重用性,可以将JS代码中的一些关键变量作为参数传递给存储过程。

希望它可以帮助你。

于 2018-07-09T06:54:43.470 回答