c# - MongoDB C# 驱动程序 - CountDocuments 错误地返回错误值
问题描述
好的,所以这有点棘手。
我有这个块
var collResult = _coll.Find(cnFilter & statusFilter & startFilter & endFilter & textFilter);
var findTask = Task.Factory.StartNew(() => {
return collResult.SortByDescending(i => i.dim_InvoiceDate_key).Skip(skip).Limit(take);
});
var countTask = Task.Factory.StartNew(() => {
return collResult.CountDocuments();
});
await Task.WhenAll(findTask, countTask);
CountDocuments 大多数时候返回一个准确的数字,表示没有跳过和限制的过滤查询。但偶尔,当它的计数超过 25k 左右时,它会返回与 findTask 结果包含的相同计数。(大多数情况下为 50 个)
尝试使用旧的 _coll.Count() 并且我收到过时的错误,我能为此做些什么吗?
解决方案
似乎如果 findTask 在 Count 甚至有时间开始之前完成(由于并发或其他原因),findTask 中设置的 Limit 正在通过共享的 Find() 泄漏,而 CountDocuments() 则认为它应该计算它。将任务放在 findTask 之前甚至还不够,以便它应该有机会在之前完成,我必须创建它自己的 Find-pipeline 以便它不会泄漏。
var findResult = _coll.Find(cnFilter & orderDateFilter & deliveryDateFilter & statusFilter & keywordFilter);
var countResult = _coll.Find(cnFilter & orderDateFilter & deliveryDateFilter & statusFilter & keywordFilter).CountDocumentsAsync();
然后我分别使用 countResult 任务
推荐阅读
- java - 在 Java 中使用“Dozer”将日期/时间字符串映射到 java.sql.Timestamp 并保存在 DB 中将时间写入 00:00:00.000000
- python - 如何根据标签映射字典转换列表列表中的元素?
- flutter - UI颤动上未选择的RadioListTile列表
- c++ - 试图查找子 cstring 是否存在于 cstring 中
- c# - 编辑:便携式 Visual Studio 代码
- html - 从 HTML 打印到点阵打印机
- javascript - 替换字符串中除空格外的所有字符
- javascript - jQuery onclick 无法正常运行
- php - 客户端错误404:如何捕捉并优雅处理?
- exoplayer - 是否可以使用 ExoPlayer 播放 m3u8 链接?