首页 > 解决方案 > 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() 并且我收到过时的错误,我能为此做些什么吗?

标签: c#asp.netmongodb

解决方案


似乎如果 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 任务


推荐阅读