Mongodb Cursor,如何遍历巨大的集合?

时间:2014-09-15 09:10:23

标签: c# .net mongodb mongodb-.net-driver mongodb-query

我有一个MongoDb数据库,里面有一个非常庞大的集合(超过200万个文档)。我想用光标迭代它。同样在迭代期间,我必须使用当前文档执行一些操作。

var pending_push_cursor = collection.FindAllAs<PendingPush>();
foreach (PendingPush p_push in pending_push_cursor)
{
    operation_with(p_push)
}

主要问题是操作将元素排入队列,并且在某些时刻迭代暂停(几秒钟),以便在添加新元素之前让操作处理一些元素。

有没有办法可以以某种方式迭代光标我可以暂停它,然后恢复? MongodbCursor保存最后访问的项目?我只知道foreach迭代,但有这样的迭代吗?

while(pending_push_cursor.isLast()){
    PendingPush p_push= pending_push_cursor.getNext()
    operation_with(p_push)
 }

如果存在类似的东西,我可以保存查询的最后一项。 提前致谢

1 个答案:

答案 0 :(得分:4)

使用带有光标的枚举器的while循环没有问题(这几乎是foreach所做的,所以你可以继续使用它。)

您应该记住,光标在不活动10分钟后会超时,具体取决于您的具体情况。如果是这样,您可以禁用该特定光标的超时。

这是一个简单的例子:

cursor.SetFlags(QueryFlags.NoCursorTimeout);
using (var enumerator = cursor.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        var item = enumerator.Current;
        // logic

        if (shouldPause)
        {
            Thread.Sleep(1000);
        }
    }
}