所以。我有一个非常基本的脚本,它连接到数据库并对包含大量文档的集合执行
find
并将其限制为 3 个项目。一切都运行顺利,除了在我的结果结束时,一个 null
并且脚本不会终止,而不是在成功后安静地关闭连接。
在这里我声明我的参数并创建我的数据库对象:
var SERVER = 'localhost',
PORT = 27017,
DATABASE = 'test',
COLLECTION = 'coll',
mongo = require('mongodb'),
db = new mongo.Db(DATABASE,
new mongo.Server(SERVER, PORT, {auto_reconnect: true}),
{});
在这里,我连接到数据库并继续使用
find
游标和 each
函数查询它:
db.open(function(err, db) {
if(err) throw err;
var collection = new mongo.Collection(db, COLLECTION),
cursor = collection.find({}, {}).limit(3);
cursor.each(function(err, doc) {
if(err) throw err;
console.log(doc);
});
db.close();
});
结果很好:
{ _id: '1',
a: 'first object' }
{ _id: '2',
a: 'second object' }
{ _id: '3',
a: 'third object' }
直到a
null
出现。
如上所述,脚本随后不会终止。
我不明白为什么,并且希望得到有关如何使其正常终止的指示。
这个问题已经有几年了,已经有了可能的答案,但我只是想为读完本文后仍然感到困惑的人指出另一种可能性。事实证明,
each
重复调用nextObject
,实际上是为了在游标耗尽时返回 null。
这里的答案就是我需要的:Node Mongo Native - 如何判断游标何时耗尽?
来自 Node MongoDB 驱动程序文档:http://mongodb.github.io/node-mongodb-native/api- generated/cursor.html#nextobject
嗯,那太愚蠢了。太多时间没有在异步设置中进行编程,并且您会犯错误:在
db.close()
循环结束之前调用了 each
。返回null
并因此被绞死。这是正确的代码:
db.open(function(err, db) {
if(err) throw err;
var collection = new mongo.Collection(db, COLLECTION),
cursor = collection.find({}, {}).limit(3);
cursor.each(function(err, doc) {
if(err) throw err;
if(doc !== null) console.log(doc);
else db.close();
});
});
我希望它能以某种方式为某人节省一些时间。