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

Posted

技术标签:

【中文标题】Mongodb Cursor,如何遍历巨大的集合?【英文标题】:MongodbCursor , how to iterate through Huge collection? 【发布时间】:2014-11-08 18:28:37 【问题描述】:

我有一个 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)
 

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

【问题讨论】:

您使用哪种语言? c# 和 Visual Studio 2014 【参考方案1】:

在光标的枚举器中使用 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);
        
    

【讨论】:

一个大问题是我使用的是 MVC ASP.NET 所以使用 thread.sleep 是对的吗? 我想暂停光标,直到调用“回调”操作或类似的操作,但我不知道如何 @xabier 这只是一个例子。你可以在不阻塞线程的情况下使用await Task.Delay(1000),或者等待一些AutoResetEvent,没关系。重要的是,只要您不调用MoveNext,枚举器就会停留在同一个地方。只是不要忘记在最后处理它。

以上是关于Mongodb Cursor,如何遍历巨大的集合?的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB中级篇①游标cursor

如何使用 Node.js 在 MongoDB 中使用 cursor.forEach()?

如何使用 Node.js 在 MongoDB 中使用 cursor.forEach()?

如何使用 mongojs 遍历整个 MongoDB 集合?

如何在 MongoDB 中按日期对集合进行排序?

如何用mongodb获取某个字段集合