node-mongodb-native - 在每次调用期间,cursor返回null作为最后一个值

m09*_*m09 8 javascript mongodb node.js node-mongodb-native

所以.我有一个非常基本的脚本,它连接到一个数据库,并find在一个包含大量文档的集合上执行,并将其限制为3个项目.一切都顺利进行,除了在我的结果结束时,a 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}),
  {});
Run Code Online (Sandbox Code Playgroud)

在这里,我连接到数据库并继续使用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();
});
Run Code Online (Sandbox Code Playgroud)

结果很好:

{ _id: '1',
  a: 'first object' }
{ _id: '2',
  a: 'second object' }
{ _id: '3',
  a: 'third object' }
Run Code Online (Sandbox Code Playgroud)

直到a

null
Run Code Online (Sandbox Code Playgroud)

出现.

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

我不明白为什么,并希望指出如何使它很好地终止.

小智 10

这个问题已经有几年了,而且已经有了一个可能的答案,但我只想指出一个人在阅读之后仍然感到困惑的另一种可能性.事实证明,当光标耗尽时,each重复调用nextObject实际意图返回null.

答案是我需要的:Node Mongo Native - 如何判断光标何时耗尽?

来自Node MongoDB驱动程序文档:http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject


m09*_*m09 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();
 });
});
Run Code Online (Sandbox Code Playgroud)

不管怎样,我希望它能为某人节省一些时间.