c# - 在 DocumentDB 中查询满足特定条件的文档计数的最佳方法是什么?

标签 c# performance azure-cosmosdb

目前我正在使用 client.CreateDocumentQuery<...>(...).Where(...).Count()
但我担心这会导致 DocumentDB 通过 Internet 传输所有选定的文档,之后我的应用程序会在客户端对它们进行计数。

客户端对象下是否有不同的查询方法来确保 DocumentDB 执行计数并仅返回最终结果?
或者我正在使用的方法是否已经以这种方式进行了优化? (即 IOrderedQueryable )
或者我是否需要编写一个存储过程,以便在服务器端进行处理?如果是这样,您如何在 JavaScript 中引用项目数?

最佳答案

要减少从 DocumentDB 发回的数据量,您可以将 LINQ 查询更改为 .Select(f => 1).AsEnumerable().Count()。这将被翻译成一个“SELECT VALUE 1 FROM ...”查询,它只会为每个匹配的结果发送一个“1”。

另一个可以加快速度的更改是通过设置 FeedOptions.MaxItemCount = -1(最大值)来更改 MaxItemCount。所以像

client.CreateDocumentQuery<..>(
        collectionLink, 
        new FeedOptions { MaxItemCount = -1 })
    .Where(..)
    .Select(f => 1)
    .AsEnumerable()
    .Count()

另一种方法是使用存储过程来执行计数 - 您可以使用现有的库,如 DocumentDB Lumenize:https://github.com/lmaccherone/documentdb-lumenize

每种方法的优缺点 - 如果您的收集存在吞吐量瓶颈,前者更好,而后者对于延迟来说更好,因为您只需发回计数而不是发回 1 并将它们加到客户端。

关于c# - 在 DocumentDB 中查询满足特定条件的文档计数的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311228/

相关文章:

c# - 多个发布类型 asp.net 5 MVC 6 API

java - 如何减少 Full GC 的数量?

sql - 更新表中所有行的有效方法

c# - 在 DocumentDB 中保存和读取 DateTimeOffset

azure - 如何为 cosmosdb 无服务器帐户配置故障转移?

c# - Asp.net AjaxFileUpload 更改按钮文本

c# - 为什么 Json.Decode 不能处理 C# 中的数组?

c# - 如何在 WPF 中正确处理(希望在 XAML 中)链接资源?

java - JVM 什么时候使用内部函数

azure - AWS SimpleDb与Azure DocumentDb有何不同?两者与ElasticSearch有何不同