MongoError:游标被杀死或超时 - 流星超时设置无效

时间:2016-07-20 11:34:58

标签: javascript mongodb meteor

My Meteor 1.2.1程序在MongoError: cursor killed or timed out循环中抛出了find().forEach(),因此我发现this page表示此代码可以阻止:{/ p>

var myCursor = db.users.find().noCursorTimeout()

然而,driver docs和我的Meteor说该方法不存在:Object [object Object] has no method 'noCursorTimeout'

Mongo autoReconnect为enabled by default但没有帮助,Meteor forum,甚至this comment的{{3}}也没有帮助。

2016-07-20 11:21:37更新开始

2016-07-20 11:37:21调用方法'updateCollections'时出现异常MongoError:游标被杀或超时

也许Meteor在2016-07-20 09:34:57失败的SOAP调用感到困惑?

.find({}, {timeout:false})

1 个答案:

答案 0 :(得分:1)

假设maxTimeMS在这种情况下有帮助,您可以通过使用rawCollection对象而不是Meteor集合本身来访问它。

这很简单:

var rawCollection = Meteor.users.rawCollection();
var cursor = rawCollection.find({}).maxTimeMS(5000);
var myData = fetchCursor(cursor);

其中fetchCursor是一个简单的光纤感知辅助函数,可以像这样实现:

var fetchCursor = Meteor.wrapAsync(function fetchCursor (cursor, cb) {
  cursor.toArray(cb);
});

虽然,我不确定这种方法是否正是您正在寻找的。

修改

如果您不需要整个文档数组但想要独立处理每个文档,最好使用each代替toArray,例如

var fetchCursor = Meteor.wrapAsync(function fetchCursor (cursor, cb) {
  cursor.each(function (err, doc) {
    if (err) return cb(err);
    if (!doc) return cb(null, { done: true }); // no more documents
    // do something with the document ...
  });
});