在 Cosmos DB 存储过程中,我使用内联 SQL 查询来尝试检索特定用户 ID 的不同计数。
我的帐户正在使用 SQL API。我已在我的 Cosmos DB 帐户的查询资源管理器中运行以下查询,我知道我应该得到 10 的计数(我的集合中有 10 个唯一的用户 ID):
SELECT VALUE COUNT(1) FROM (SELECT DISTINCT c.UserId FROM root c) AS t
但是,当我在存储过程门户中运行此命令时,我要么返回 0 条记录,要么返回 18 条记录(文档总数)。我的存储过程的代码如下:
function GetDistinctCount() {
var collection = getContext().getCollection();
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
'SELECT VALUE COUNT(1) FROM (SELECT DISTINCT c.UserId FROM root c) AS t',
function(err, feed, options) {
if (err) throw err;
if (!feed || !feed.length) {
var response = getContext().getResponse();
var body = {code: 404, body: "no docs found"}
response.setBody(JSON.stringify(body));
} else {
var response = getContext().getResponse();
var body = {code: 200, body: feed[0]}
response.setBody(JSON.stringify(body));
}
}
)
}
在查看了各种反馈论坛和文档之后,我认为没有一个优雅的解决方案可以让我像在普通 SQL 中那样简单地执行此操作。
UserId 是我的分区键,我在 C# 代码中以及在门户中测试它时传递它,因此在调用存储过程时不需要设置其他参数。我通过 C# 调用此存储过程,添加任何其他参数都会影响我对该代码的测试,因此如果可以的话,我希望不引入任何参数。
最佳答案
您的问题是由于您错过了为存储过程设置分区键引起的。
请看官方document中的说法:
还有这个:
因此,当您在分区集合下执行存储过程时,您需要传递分区键参数。有必要! (这个案例也解释了这一点:Documentdb stored proc cross partition query)
回到你的问题,你从不传递任何分区键,等于你传递一个 null
值或分区键的 ""
值,所以它不输出任何数据,因为你没有任何 userId 等于 null 或“”。
我的建议:
您可以使用普通的 Query SDK 来执行 sql,并设置 enableCrossPartitionQuery: true
,这样您就可以扫描整个集合而无需设置分区键。请引用这个小样本:Can't get simple CosmosDB query to work via Node.js - but works fine via Azure's Query Explorer
关于azure - SELECT VALUE COUNT(1) FROM (SELECT DISTINCT c.UserId FROM root c) AS t 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085873/