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

C# 在DocumentDB中查询满足特定条件的文档数的最佳方法是什么?,c#,performance,azure-cosmosdb,C#,Performance,Azure Cosmosdb,目前我正在使用client.CreateDocumentQuery…Where…Count 但我担心这会导致DocumentDB通过internet传输所有选定的文档,之后我的应用程序会在客户端对它们进行计数 客户机对象下是否有其他查询方法可确保DocumentDB执行计数并仅返回最终结果? 或者我正在使用的方法已经以这种方式进行了优化?i、 e.可查询的 或者我是否需要编写一个存储过程,以便将处理保持在服务器端?如果是这样,如何引用JavaScript中的项目计数?要减少从DocumentDB

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

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

要减少从DocumentDB发回的数据量,可以将LINQ查询更改为.Selectf=>1.AsEnumerable.count。这将从…转换为选择值1。。。查询,该查询只为每个匹配的结果发送1

另一个更快的更改是通过设置FeedOptions.MaxItemCount=-1最大值来更改MaxItemCount。大概是

client.CreateDocumentQuery<..>(
        collectionLink, 
        new FeedOptions { MaxItemCount = -1 })
    .Where(..)
    .Select(f => 1)
    .AsEnumerable()
    .Count()
另一种方法是使用存储过程执行计数-您可以使用DocumentDB Lumenize这样的现有库:


每种方法的优点和缺点-如果收集的吞吐量受到限制,则前者更好,后者在延迟方面更好,因为您只需发回计数,而不是发回1,并将它们汇总到客户端。

我很惊讶使用辅助拷贝的好处克服了发送数千个1的延迟。您的建议仅适用于在同一数据中心内传输时,还是仍适用于从数据中心向外传输?存储过程的延迟当然更好—其优势在于吞吐量。使用查询意味着您可以利用所有二级数据库进行读取。因此,如果多次发出此请求或与其他并行操作竞争,则这是一种可取的做法,但是临时的,或者在未完全加载的系统上,存储过程可能会更好?这是一个很好的解决方案。Cosmos db文档上推荐的SELECT值计数在进行计数时对过滤没有帮助。