Cosmos DB存储过程,UDF和可重用代码-它们如何组合在一起?

时间:2018-07-09 02:56:34

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我有很多问题:)

我已经开始使用Cosmos DB(SQL API)。喜欢它!

但是我正在努力寻找构建和管理代码的最佳方法。我正在使用Visual Studio。

这是一些代码,我将基于以下4个javascript函数提出问题:

constructor

在我的解决方案中,这4个函数位于4个不同的.js文件中。我会将前三个作为自己的用户定义函数部署在我的集合中。最后,我将其部署为存储过程。

我的应用程序将执行“ processYay”存储过程以执行某些操作。 UDF支持。

问题:

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

如果答案是“ nope”,“ nope”和“ nope”,则似乎还有另一种解决方案:在存储过程本身内部定义函数。它将完全像这样工作:

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, ...);
}

但是然后...

如何重用代码?

我的JavaScript位于.NET类库中。我很喜欢“ #include”技巧:)。我会与webpack等一起入侵吗?

或者...人们使用了一些可接受的方法吗?

1 个答案:

答案 0 :(得分:0)

  

1。是否可以直接从存储过程调用UDF,类似于上面在“ processYay”中所做的操作?还是只能以   查询的一部分?

     

2。是否可以像在“ createYayDoc”中那样从另一个UDF调用UDF?

     

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

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

  

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

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

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

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

希望它对您有帮助。