我使用mongoDB的本机驱动程序。在db中我有大约7个集合,我想创建一个变量来存储每个集合中的条目数量减去最后一个集合。之后我想创建另一个变量来存储最后一个集合的条目,然后我想通过res.render()命令传递变量并在网页上显示它。
我在这里遇到的问题是我习惯于同步执行功能,在这种情况下直接从窗口出来。
如果所有内容都是同步执行,下面的代码就是我想的方式。
var count = 0;
db.listCollections().toArray(function(err,collection){
for(i = 1; i < collection.length;i++){
db.collection(collection[i].name).count(function(err,value){
count = count + value;
})
}
var count2 = db.collection(collection[i].name).count(function(err,value){
return value;
})
res.render('index.html',{data1: count, data2: count2})
})
显然,这并不是我想要这样做,我试着玩弄承诺,但结果却更加困惑。
答案 0 :(得分:0)
你可以用Promises做这样的事情:
获取集合名称,迭代它们,并返回计数或条目(如果它是最后一个集合)。然后总结个人计数并将所有内容发送给客户。
db.listCollections().toArray()
.then(collections => {
let len = collections.length - 1
return Promise.all(collections.map(({name}, i) => {
let curr = db.collection(name)
return i < len ? curr.count() : curr.find().toArray()
}
))
}
)
.then(res => {
let last = res.pop(),
count = res.reduce((p, c) => p + c)
res.render('index.html', {count, last})
})