node.js - 蒙戈错误: cursor is dead (mongo node driver)

标签 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();
  });
});

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

怎么了?怎么解决?如果我仍然想在光标上使用 forEach 如何解决?

最佳答案

我有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 来完成此操作。

关于node.js - 蒙戈错误: cursor is dead (mongo node driver),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26489875/

相关文章:

java - 无法将 BasicDBObject 转换为 [B

javascript - 调试 Node mongo

javascript - 有没有一种方法可以用 MongoDB 识别的 JSON 来表示 ISODate 和 ObjectID 字段?

javascript - 多个 node-mongodb-native 连接

javascript - Oracle JET CLI "ojet"未定义

node.js - 无法访问 View

node.js - Mongoose 聚合匹配不适用于正则表达式

java - 如何使用JAVA检索存储在mongoDB中的JSON中的键(嵌套)的值?

node.js - Node Mongodb驱动: different result on aggregate

node.js - 撇号 cms 中图像的默认值?