2012-08-30 13 views
8

所以。我有一个非常基本的脚本,它连接到一个数据库,并在包含大量文档的集合上执行find并将其限制为3个项目。除了在我的结果结尾处,一切都运行平稳,一个null和脚本不会终止,而不是在成功完成后悄然关闭连接。node-mongodb-native - 游标在每次调用期间返回null作为最后一个值

在这里我声明我的PARAMS和创建我的数据库对象:

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' } 

直到出现

null 

出现。

如上所述,脚本然后继续不终止。

我不明白为什么,并会很高兴指示如何使它很好地终止。

回答

7

那么,那是愚蠢的。在异步设置中没有编程的时间过长,并且出现错误: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(); 
}); 
}); 

我希望它可以节省一些分钟给某人,不知何故。

10

这个问题已经有几年了,已经有了一个可能的答案,但我只想指出另一种可能性,对于任何读完这些后仍然感到困惑的人。事实证明,each反复调用nextObject,实际上当游标耗尽时它将返回null。这里

的答案是我需要的一个:Node Mongo Native - how to tell when a cursor is exhausted?

从节点MongoDB的驱动程序文档:http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

+1

这应该是实际的答案。 – Julian

+0

甚至,在调用cursor.each期间,我得到一个null作为最后一个值。 nodejs版本:0.12.9,mongodb ddriver版本:^ 2.2.33。很好,我看到了这个答案。 –

相关问题