2014-09-15 2 views
1

나는 엄청난 규모의 문서를 가지고있는 MongoDb 데이터베이스를 가지고있다. 나는 그것을 커서로 반복하고 싶다. 또한 반복 도중 현재 문서로 일부 작업을 수행해야합니다.MongodbCursor, 거대한 컬렉션을 반복하는 방법은 무엇입니까?

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) 
} 

similat이 있으면 마지막으로 쿼리 한 항목을 저장할 수 있습니다. 미리 감사드립니다

+0

:

다음은 간단한 예제? – i3arnon

+0

C# 및 Visual Studio 2014 – Badulake

답변

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); 
     } 
    } 
} 
+0

큰 문제는 MVC ASP.NET을 사용하여 thread.sleep을 사용하는 것이 맞습니까? – Badulake

+0

"콜백"동작이 호출 될 때까지 커서를 일시 중지하려고합니다. 그러나 비슷하지는 않지만 어쨌든 모르겠습니다. – Badulake

+0

@xabier 그냥 예제 일뿐입니다. 스레드를 차단하지 않고'await Task.Delay (1000)'를 사용하거나'AutoResetEvent'를 기다릴 수 있습니다. 중요하지 않습니다. 중요한 것은'MoveNext'를 호출하지 않는 한 열거자는 같은 위치에 머물러 있다는 것입니다. 끝에서 처리하는 것을 잊지 마세요. – i3arnon

관련 문제