【问题标题】:Azure Cosmos DB SQL API stored procedure exampleAzure Cosmos DB SQL API 存储过程示例
【发布时间】:2020-08-27 17:42:15
【问题描述】:

我是 Azure Cosmos DB 的新手,我正在尝试使用 SQLAPI 创建一个存储过程来返回数据。

以以下为例:

{ 
  "id":"123",
  "fname" : "John",
  "lname" : "Doe",
  "receivedTime" : "08/08/2019 09:54:57",
  "subjects" : [
{
   "subjectid" : "01",
   "subjectname" : "English"
   "subjectmark" : "80"
},
{
   "subjectid" : "02",
   "subjectname" : "Math"
   "subjectmark" : "70"
}
]
}

我将如何构建一个存储过程来返回根数据以及主题标记的平均值?

【问题讨论】:

  • 您是否有理由特别想要一个存储过程?这可以通过直接查询来完成。
  • 我想在需要时调用该过程,并且可能已注册 proc 并将其暴露给某些外部接口。我也在尝试熟悉语法。
  • 请编辑您的问题以显示您到目前为止所做的事情以及您遇到的问题(输出问题、错误等)。另外,请提供一个示例,说明您的预期输出是什么样的。我不确定您所说的“根数据”是什么意思——这将是一个很好的解释。

标签: stored-procedures azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

请试试这个:

function sample() {
    var collection = getContext().getCollection();

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM root r',
    function (err, feed, options) {
        if (err) throw err;

        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var response = getContext().getResponse();
            for(var x in feed){
                var totalmark = 0;
                var avargemark = 0;
                for(var y in feed[x].subjects){
                    totalmark += parseInt(feed[x].subjects[y].subjectmark);
                }
                avargemark = parseFloat(totalmark)/feed[x].subjects.length;
                feed[x].avargemark = avargemark;
            }

            var body = feed;
            response.setBody(JSON.stringify(body));
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

顺便说一句,存储过程的作用域始终是分区键。您需要提供分区值才能执行此操作。

【讨论】:

    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多