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(); }); });
当我设置限制为1000
( collection.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
。