我创建了一个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
异常(偶尔也不会抛出。我的代码是错误的吗?
答案 0 :(得分:1)
我找到了导致此错误的原因。
如果出现以下情况,Tailable游标可能会死亡或无效:
来自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
}