azure - SELECT VALUE COUNT(1) FROM (SELECT DISTINCT c.UserId FROM root c) AS t 不起作用

标签 azure azure-cosmosdb azure-cosmosdb-sqlapi

在 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中的说法:

enter image description here

还有这个:

enter image description here

因此,当您在分区集合下执行存储过程时,您需要传递分区键参数。有必要! (这个案例也解释了这一点:Documentdb stored proc cross partition query)

回到你的问题,你从不传递任何分区键,等于你传递一个 null 值或分区键的 "" 值,所以它不输出任何数据,因为你没有任何 userId 等于 null 或“”。

enter image description here

我的建议: 您可以使用普通的 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/

相关文章:

c# - 如何正确发送PATCH请求

c# - 为什么我的项目中程序集绑定(bind)失败?

azure - 使用 Azure AD 凭据使用 HTTP 基本身份验证下载 Azure Blob

azure - Windows Azure 云服务重新生成 SSL key

c# - DocumentDB 不支持的查询

c# - DocumentDb 事务作为外部事务范围的一部分

azure-cosmosdb - 如何使用 Gremlin 查询将所有节点作为分层树获取?

azure - 如何在 Azure CosmosDB 中编写 LIKE 查询?

c# - 如何在 cosmos db C# 中插入一个文档的项目列表?

azure - 在 Sql Server 数据库事务中登记 Cosmos 事务