我希望获得所选分区中所有文档的计数。但是,以下代码将返回集合中所有文档的计数,费用为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,是否有更好的解决方案来获取所选分区中所有文档的数量?
答案 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问题。