8

所以。我有一个非常基本的脚本,它连接到数据库并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' }

直到一个点

null

出现。

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

我不明白为什么,并希望得到有关如何使它很好地终止的指针。

4

2 回答 2

10

这个问题已经有几年的历史了,并且已经有了一个可能的答案,但我只是想为那些在阅读本文后仍然感到困惑的人指出另一种可能性。事实证明,each重复调用nextObject实际上是为了在游标耗尽时返回 null 。

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

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

于 2015-06-23T20:09:26.653 回答
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();
 });
});

我希望它会以某种方式为某人节省一些时间。

于 2012-08-30T22:24:06.020 回答