2013-04-20 84 views
1

我創建了一個帶有50M默認大小的封頂集合。最近,我注意到當封頂的集合存儲大小超過50M時,出現Cursor not found錯誤。我不確定是什麼原因導致這種情況:在封頂收集大小小於默認最大大小之前,我從來沒有收到過此錯誤。使用帶有NoCursorTimeout的Tailable光標時出現'遊標未找到'錯誤

if (this._cursor == null || this._cursor.IsDead) 
{     
    var cursor = this._queueCollection.Find(Query.GT("_id", this._lastId)) 
      .SetFlags(QueryFlags.AwaitData | 
      QueryFlags.TailableCursor | 
      QueryFlags.NoCursorTimeout) 
      .SetSortOrder(SortBy.Ascending("$natural")); 
    this._cursor =(MongoCursorEnumerator<QueueMessage<T>>)cursor.GetEnumerator(); 
} 

try 
{ 
    if (this._cursor.MoveNext()) 
     //do some things 
     return this._cursor.Current; 
    else 
    { 
     if (this._cursor.IsDead){ 
       this._cursor.Dispose(); 
       this._cursor=null; 
     } 
    } 
    return null; 
} 
catch{} 

this._cursor.MoveNext()將拋出一個異常cursor not found(偶爾,並不總是拋出是我的代碼錯

回答

1

我找到了導致此錯誤的原因。

如果出現以下情況,Tailable遊標可能會死亡或無效:

  1. 該查詢返回不匹配。
  2. 遊標在集合的「結尾」返回文檔,然後應用程序刪除這些文檔。從MongoDB的官方網站

參考有關創建tailable光標(http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/

在我的應用程序,在沒有找到一個'光標」異常被拋出它始終是因爲遊標在返回文檔的「結束「,然後應用程序刪除那些文件。

0

你可以使用foreach:?

var query1 = new QueryBuilder<Message>().GT(m => m.date, lastTransferredMessageDate); 
var result = messagesCollection.FindAs<Message>(query1).SetFlags(QueryFlags.NoCursorTimeout); 

foreach (var message in result) 
{ 
    // Your code 
}