目前我正在使用client.CreateDocumentQuery<...>(...).Where(...).Count()
但我担心这会导致DocumentDB通过互联网传输所有选定的文件,之后我的应用程序会在客户端对它们进行计数。
客户端对象下是否有不同的查询方法可以确保DocumentDB执行计数,并返回最终结果?
或是我正在使用的方法,已经以这种方式进行了优化? (即IOrderedQueryable
)
或我是否需要编写存储过程,以便在服务器端保持处理?如果是这样,你如何引用JavaScript中的项目数?
答案 0 :(得分:3)
要减少从DocumentDB发回的数据量,可以将LINQ查询更改为.Select(f =&gt; 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并将它们总结为客户端。