如何在 Azure Cosmos DB 中将 JavaScript 存储过程写入来自 SQL API 的 return 数据

How to write a JavaScript stored procedure in Azure Cosmo DB to return data from SQL API

我正在尝试创建一个 Cosmo DB 存储过程以 return 一个相对简单的 SQL 语句的结果。如果它纯粹是 SQL 我会没事的,但因为我对 JavaScript 一无所知,所以我正在努力挣扎。任何帮助将不胜感激。这是 SQL 查询:

SELECT distinct cx.ID, cxa.FieldValue as PartNo, cx.TransactionDate, cx.TransactionStatus
FROM c
JOIN cx in c.File.Transactions
JOIN cxa in cx.AppDetails
JOIN
(
 SELECT cx2.ID, cxa2.FieldValue as PartNo, max(cx2.TransactionDate) as TransactionDate
 FROM c
 JOIN cx2 in c.File.Transactions
 JOIN cxa2 in cx2.AppDetails
 WHERE c.File.Category= 'BatchParts' and cxa2.FieldName ='PartNo'
 GROUP BY cx2.ID,cxa2.FieldValue
) B 
WHERE c.File.Category= 'BatchParts' and cxa.FieldName ='PartNo'

您可以尝试这样的操作:

function getItems(category,fieldName) {
    var collection = getContext().getCollection();

    var query = 'SELECT distinct cx.ID, cxa.FieldValue as PartNo, cx.TransactionDate, cx.TransactionStatus ' +
                'FROM c ' +
                'JOIN cx in c.File.Transactions ' +
                'JOIN cxa in cx.AppDetails ' +
                'JOIN ' +
                '( ' +
                    'SELECT cx2.ID, cxa2.FieldValue as PartNo, max(cx2.TransactionDate) as TransactionDate ' +
                    'FROM c ' +
                    'JOIN cx2 in c.File.Transactions ' +
                    'JOIN cxa2 in cx2.AppDetails ' +
                    'WHERE c.File.Category= @Category and cxa2.FieldName = @FieldName ' +
                    'GROUP BY cx2.ID,cxa2.FieldValue ' +
                ') B ' + 
                'WHERE c.File.Category= @Category  and cxa.FieldName = @FieldName';

    var filterQuery =
    {
        'query' : query,
        'parameters' : [{'name':'@Category', 'value':category},{'name':'@FieldName', 'value':fieldName}] 
    };

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        filterQuery,
    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();
            var body = feed;
            response.setBody(JSON.stringify(body));
        }
    });

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

对了,调用存储过程的时候需要传递分区键值。而且你只能从这个分区中获取数据。可以参考这个doc and this.

这种类型的查询,如果在存储过程中或通过 SDK 超时,最好使用 Synapse Link 来处理。存储过程不适合查询,因为它们仅在主副本上运行(其中有 4 个)。由于吞吐量在所有四个副本之间平均分配,因此存储过程仅获得预配吞吐量的 1/4。

Synapse Link 旨在用于您具有大型、复杂的分析类型查询并希望使用 Power BI 可视化数据的此类场景。要了解有关 Cosmos DB 和 Synapse 的更多信息,请参阅 What is Azure Synapse Link for Azure Cosmos DB (Preview)?