如何在 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.');
}
这种类型的查询,如果在存储过程中或通过 SDK 超时,最好使用 Synapse Link 来处理。存储过程不适合查询,因为它们仅在主副本上运行(其中有 4 个)。由于吞吐量在所有四个副本之间平均分配,因此存储过程仅获得预配吞吐量的 1/4。
Synapse Link 旨在用于您具有大型、复杂的分析类型查询并希望使用 Power BI 可视化数据的此类场景。要了解有关 Cosmos DB 和 Synapse 的更多信息,请参阅 What is Azure Synapse Link for Azure Cosmos DB (Preview)?
我正在尝试创建一个 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.');
}
这种类型的查询,如果在存储过程中或通过 SDK 超时,最好使用 Synapse Link 来处理。存储过程不适合查询,因为它们仅在主副本上运行(其中有 4 个)。由于吞吐量在所有四个副本之间平均分配,因此存储过程仅获得预配吞吐量的 1/4。
Synapse Link 旨在用于您具有大型、复杂的分析类型查询并希望使用 Power BI 可视化数据的此类场景。要了解有关 Cosmos DB 和 Synapse 的更多信息,请参阅 What is Azure Synapse Link for Azure Cosmos DB (Preview)?