Node MongoDB循环访问集合的第一条记录并将其推送到数组中



我正试图通过数字集合名称获取用户名列表。我已经创建了查询,看起来工作得很好,但它没有推进到数组中,所以我可以返回整个数据作为api的响应。

router.get('/chat-logs', async (req, res) => {
const collections = Object.keys(db.db.collections);
MongoClient.connect(url, { useUnifiedTopology: true }, function(err, dbm) {
if (err) throw err;
var dbo = dbm.db('dbname');
let collections = dbo
.listCollections()
.toArray()
.then(data => {
let names = [];
forEach(data, function(e) {
let { name } = e;
if (!isNaN(name)) {
dbo.collection(name).findOne({}, function(err, result) {
if (err) throw err;
names[name] = `${result.first_name} ${result.last_name}`;
});
}
});
console.log(names)
res.send(names);
});
});
});

正如你所看到的,我正在获取所有的集合名称,因为聊天日志与它们对应的id一起存储为一个集合,我正在循环它们并获取它们的最后字段。最后,我试图将它推送到names[]数组中,这样我就可以收集所有的名称并发送响应。问题是数组在查询范围之外仍然为空。我有点陷入了困境,我想知道是否有更简单的方法可以将所有集合的最后一个字段作为数组,如果没有,我该如何解决这个问题?

感谢

参见节点JS Promise.all和forEach

你可以做这样的事情:

router.get('/chat-logs', async (req, res) => {
const collections = Object.keys(db.db.collections);
MongoClient.connect(url, { useUnifiedTopology: true }, function(err, dbm) {
if (err) throw err;
var dbo = dbm.db('dbname');
let collections = dbo
.listCollections()
.toArray()
.then(data => {
let names = [];
i = 0;
data.forEach(function(e) {
let { name } = e;
if (!isNaN(name)) {
dbo.collection(name).findOne({}, function(err, result) {
if (err) throw err;
names.push(`${result.first_name} ${result.last_name}`);
i=i+1;
if(i>(names.length-1)){
// all callbacks have finished. 
console.log(names)
res.send(names);
}
});
}
});
});
});
});

最新更新