我正在使用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
,如何解决?答案 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
。