使用带有NoCursorTimeout的Tailable Cursor时出现'Cursor not found'错误

时间:2013-04-20 15:04:07

标签: mongodb mongodb-.net-driver

我创建了一个50M默认大小的上限集合。最近,我注意到当上限集合存储大小超过50M时,我收到Cursor not found错误。我不确定是什么原因造成这种情况:在封顶集合大小小于默认最大大小之前,我从未收到此错误。

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异常(偶尔也不会抛出。我的代码是错误的吗?

2 个答案:

答案 0 :(得分:1)

我找到了导致此错误的原因。

如果出现以下情况,Tailable游标可能会死亡或无效:

  1. 查询不返回任何匹配项。
  2. 光标返回集合“end”处的文档,然后应用程序删除这些文档。
  3. 来自mongodb官方网站的关于创建tailable游标(http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/

    的参考资料

    在我的应用程序中,当抛出“找不到游标”异常时,它始终是因为游标返回集合“end”处的文档,然后应用程序删除这些文档。

答案 1 :(得分: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
}