我目前正在开发一个NodeJS / Mongo项目,我需要从集合中提取所有文档。我目前编写了以下代码:
var Db = require('mongodb').Db,
MongoClient = require('mongodb').MongoClient,
Server = require('mongodb').Server,
ReplSetServers = require('mongodb').ReplSetServers,
ObjectID = require('mongodb').ObjectID,
Binary = require('mongodb').Binary,
GridStore = require('mongodb').GridStore,
Grid = require('mongodb').Grid,
Code = require('mongodb').Code,
assert = require('assert');
var server = new Server('[server]', 27017);
var authDB = new Db('admin', server);
var DB1250 = new Db('1250', server);
var findDocuments = function (callback) {
authDB.authenticate("Username", "Password");
DB1250.open(function (error, db) {
if (error) {
console.log(error);
}
else {
console.log("successfully accessed: ", db);
callback;
var cursor = db.collection('Patients').find();
console.log('cursor ', cursor);
cursor.forEach(function (error, document) {
if (error) {
console.log('Document does not exist. Error: ', error);
}
else {
console.log('Document: ', document);
}
});
}
});
};
findDocuments(function (data) {
});
我能够验证/连接到服务器,连接到数据库,并连接到集合。当我进入forEach循环迭代所有文档时,我不断收到错误"回调不是函数"。你们能看到我做错了吗?
答案 0 :(得分:1)
我相信你在那里的光标还没有解析成一个数组,所以forEach
不是一个有效的方法。您可能正在寻找eachAsync,它会在迭代之前等待查询返回。
或者,您可以等待查询承诺解决,即:
cursor.then(docs => docs.forEach(callback));
我个人觉得更清楚一点。
答案 1 :(得分:0)
在使用Mongoose之后,我想出了解决方案:
str
答案 2 :(得分:0)
cursor.forEach()
是一个异步操作,但什么都不返回。因此,您不应该在同一行下方db.close()
或同样地进行操作。
除了;我不确定您引用的是哪个版本的Node驱动程序,但是在最近的版本中,如v3 + cursor.forEach()
不会出现错误的第一类回调,就像您在代码中使用的那样。它需要一个“迭代器”和一个“结束”回调,例如;
cursor.forEach(doc => console.log(doc),
err => err ? console.log(err)
: db.close())
因此,上面的代码可以正常工作,迭代并逐个处理文档,而不会等到所有文档都被检索到内存中。