文档计数查询忽略PartitionKey

时间:2018-03-13 07:03:54

标签: azure-cosmosdb

我希望获得所选分区中所有文档的计数。但是,以下代码将返回集合中所有文档的计数,费用为0 RU。

    var collectionLink = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);

    string command = "SELECT VALUE COUNT(1) FROM Collection c";

    FeedOptions feedOptions = new FeedOptions()
    {
        PartitionKey = new PartitionKey(BuildPartitionKey(contextName, domainName)),
        EnableCrossPartitionQuery = false
    };

    var count = client.CreateDocumentQuery<int>(collectionLink, command, feedOptions)
        .ToList()
        .First();

在查询中添加WHERE c.partition = 'blah'子句会有效,但在集合中需要花费3.71 RU,包含11个文档。

为什么上面的代码片段会返回整个Collection的Count,是否有更好的解决方案来获取所选分区中所有文档的数量?

2 个答案:

答案 0 :(得分:1)

  

如果查询包含针对分区键的过滤器,例如SELECT   * FROM c WHERE c.city =“Seattle”,它被路由到一个分区。如果查询没有对分区键进行过滤,那么它就是   在所有分区中执行,结果在客户端合并。

当我们向Azure Cosmos DB发出查询时,您可以检查SDK从此官方doc执行的逻辑步骤。

  

如果查询是COUNT之类的聚合,则来自个人   将分区相加以产生总计数。

因此,当您只使用SELECT VALUE COUNT(1) FROM Collection c时,它将在所有分区中执行,结果将合并到客户端。

如果您想获取所选分区中所有文档的计数,只需添加where c.partition = 'XX'过滤器即可。

希望它对你有所帮助。

答案 1 :(得分:0)

我认为这实际上是一个错误,因为在查询和classes[one_hot ==1 ] 中设置的分区键都存在相同的问题。

这里已经报道了类似的问题: https://github.com/Azure/azure-cosmos-dotnet-v2/issues/543

Microsoft的回应听起来像是x64特定的SDK问题。

相关问题