MongoError:游标已死(mongo节点驱动程序)

时间:2014-10-21 15:01:06

标签: node.js mongodb node-mongodb-native

我正在使用node-mongodb-native 2.0 http://mongodb.github.io/node-mongodb-native/2.0/

使用以下Node.js代码:

var MongoClient = require('mongodb').MongoClient;
var mongoUrl = 'mongodb://localhost/twitter';

MongoClient.connect(mongoUrl, function(err, db) {
  if (err) return console.error(err);

  var collection = db.collection('tweets');

  collection.find().limit(1000).forEach(function(tweet) {
    console.log(tweet.id);
  }, function(err) {
    if (err) console.error(err);
    db.close();
  });
});

当我将限制设置为1000collection.find().limit(1000))时,我能够检索前几百条记录,但稍后收到错误消息{ [MongoError: cursor is dead] name: 'MongoError', message: 'cursor is dead' }(我有100万条记录)在我的收藏中)。但程序运行正常我们指定800作为限制。也可以不指定任何限制(只是collection.find()),并且脚本只会继续运行而没有任何错误(读取的记录多于1000个记录)。

出了什么问题?怎么解决?如果我仍想在游标上使用forEach,如何解决?

1 个答案:

答案 0 :(得分:1)

我有reproduced this issue个包含较小文档的示例数据集。告知部分可能来自MongoDB的这个日志行:

2014-10-21T18:50:32.548+0100 [conn50] query twitter.tweets planSummary: COLLSCAN cursorid:30362014860 ntoreturn:200000 ntoskip:0 nscanned:199728 nscannedObjects:199728 keyUpdates:0 numYields:0 locks(micros) r:120400 nreturned:199728 reslen:4194308 120ms

关键部分,我怀疑是reslen:4194308,看起来非常接近默认批量4MiB。我已经与node.js驱动程序开发人员保持联系,会告诉您最终是否为错误(更新:已打开NODE-300,并在mongodb-core@1.0.4中确认已修复)。

与此同时,我建议您使用评论中的解决方法,即使用投影来减少结果中的数据量并回避问题。

更新了解决方案:如果您看到此(或类似)问题,请更新您的mongodb-core版本并重试 - 新版本不再出现错误并且运行速度要快一些也。我这样做是通过删除我的node_modules并为我的测试应用程序重新运行npm install