MongoDb命令无法获取更多Mongo C#驱动程序

MongoDb命令无法获取更多Mongo C#驱动程序,c#,mongodb,C#,Mongodb,除非你有大量的数据,否则这个问题不容易重现 我有很多查询是返回大量数据(数千万个结果)的聚合。这些查询的结果显然太大,无法存储在内存中,因此当我返回结果时,我会执行ToEnumerable()。当我迭代返回的IEnumerable时,最终得到一个错误 MongoDB.Driver.MongoCommandException:命令getMore失败:找不到游标id XXXXXXXXX 我正在使用最新的C#驱动程序(2.6.1) 我研究了这个问题,听起来问题在于光标超时,但我尝试过删除光标超时,但没

除非你有大量的数据,否则这个问题不容易重现

我有很多查询是返回大量数据(数千万个结果)的聚合。这些查询的结果显然太大,无法存储在内存中,因此当我返回结果时,我会执行
ToEnumerable()
。当我迭代返回的
IEnumerable
时,最终得到一个错误

MongoDB.Driver.MongoCommandException:命令getMore失败:找不到游标id XXXXXXXXX

我正在使用最新的C#驱动程序(2.6.1)

我研究了这个问题,听起来问题在于光标超时,但我尝试过删除光标超时,但没有成功。我能够绕过这个问题的唯一方法是使用ToList(),它将整个结果加载到内存中,而我不想使用这些大型查询


如果有任何帮助,我将不胜感激。我花了很多时间在这个问题上,几乎没有结果。

这实际上让我想起了我曾经遇到的服务器端游标问题,这很可能是一个类似的问题。您正在修改(
.DeleteOne
..)您正在迭代的集合。在我的例子中,我有一个简单的查询,我正在迭代,在这个循环中,我将把文档插入MongoDB中,它将被光标拾取。这给了我无尽的循环

现在,您正在删除这里的内容,但我想,这可能会导致一些古怪的行为。这可能是一种选择吗 a) 是否尝试为
.Delete()
使用单独的MongoDB客户端?我怀疑这是否有帮助,但也许值得一试
b) 不是直接删除,而是在批量删除(
DeleteMany()
)之前保留数千万个
ObjectId
的列表与删除单个文档相比,这可能会加快速度?

您能给我们展示一些您尝试过的代码吗?但是,光标超时的部分在哪里?在枚举IEnumerableAre时会发生异常,您可以在任何地方显式设置
MongoClientSettings.SocketTimeout
?它应该保持不变,默认值为0(=无限)。另外,您得到的确切异常是什么?
        var agg = collection.Aggregate()
            .Group(new BsonDocument
            {
                { "_id" , "$FileID" },
                { "id", new BsonDocument
                    {
                        {  "$min", "$_id" }
                    }
                },
                { "Count", new BsonDocument
                {
                    {"$sum", 1 }
                } }
            })
            .Match(new BsonDocument
                { { "Count", new BsonDocument { { "$gt", 1 } } }
            });

        agg.Options.AllowDiskUse = true;

        var results = agg.ToEnumerable();
        var deletedCount = 0;

        // exception occurs here

        foreach (var result in results)
        {
            collection.DeleteOne(x => x.Id == result["id"].AsObjectId);
            deletedCount += 1;
            Console.WriteLine("Deleted Count: " + deletedCount);
        }