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

我正在使用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) )时,我能够检索到前几百条logging,但是我得到了错误消息{ [MongoError: cursor is dead] name: 'MongoError', message: 'cursor is dead' }稍后(我collections了100万条logging)。 但程序运行确定我们指定800作为限制。 没有指定任何限制(只是collection.find() )也是可以的,而脚本只是继续前进而没有任何错误(读取方式多于1000条logging)。

怎么了? 怎么解决? 如何解决,如果我仍然希望使用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(更新:打开了NODE-300 ,并确认mongodb-core@1.0.4为修复结果)。

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

更新的分辨率:如果你看到这个(或者类似的)问题,那么请更新你的mongodb-core版本mongodb-core试 – 新版本不会再出错,运行速度也会更快。 我通过删除我的node_modules并重新运行我的testing应用程序的npm install