Node.js MongoError:光标已停止(mongo节点驱动程序)

Node.js MongoError:光标已停止(mongo节点驱动程序),node.js,mongodb,node-mongodb-native,Node.js,Mongodb,Node Mongodb Native,我正在使用节点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.c

我正在使用节点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'}
(我在我的集合中有一百万条记录)。但是程序运行正常,我指定
800
作为限制。也可以不指定任何限制(只需
collection.find()
),脚本将继续运行,不会出现任何错误(读取超过1000条记录)

发生了什么?如何解决?如果我仍然想在游标上使用
forEach
,如何解决这个问题?我有一个较小文档的示例数据集。说明部分可能是来自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驱动程序开发人员联系过,他们会告诉您这是否是一个bug(更新:opened,并在
mongodb中确认修复)-core@1.0.4
结果)

同时,我建议使用评论中的变通方法,即使用预测来减少结果中的数据量,并避开这个问题


更新的解决方案:如果您看到此问题(或类似问题),请更新您的
mongodb core
版本,然后重试-新版本不再出错,运行速度也大大加快。为此,我删除了我的node_模块,并重新运行测试应用程序的
npm install

快速问题-800 limit选项运行(大约)需要多长时间?@AdamComerford感觉像是第二个。好的,所以不太可能达到超时。我只是试着复制(直接复制和粘贴你的代码,使用一个有大约500k文档的测试数据库),没有出现错误,也尝试了2000、20000、100k的限制——仍然没有问题。文件特别大吗?您只能尝试使用投影返回id:
collection.find({},{u-id:0,id:1})
-如果对id字段进行索引,则将是一个覆盖索引查询。@AdamComerford如果我使用
collection.find({},{u-id:0,id:1})
,我成功检索了1000条记录。我运行了一个
db.stats()
,而
avgObjSize
是6954.4177304430095。好的,我现在已经复制了它,似乎每次都可以随意使用我的测试数据。我看看这是不是个错误我看到版本改变了谢谢