我最近在Node.js项目中开始使用arrow函数,promises(bluebird)和MongoDB。正如您在下面看到的,我宣传了所有mongodb本机驱动程序。到目前为止,工作就像一个魅力。
现在,我想使用.forEach()方法,我想知道如何使用它。这是一个想法:
Padding is invalid and cannot be removed.
我的问题是:
[可选的问题对我有很大帮助:]
非常感谢您的回答或建议!
[编辑:我预先更新了。我觉得我再次回调地狱了。]
答案 0 :(得分:1)
你不需要任何蓝鸟。 mongo驱动程序已经建立了承诺。由于forEach
不会返回任何内容,因此您可以使用map()
将每个文档更新处理为一个承诺,使用toArray()
将它们减少为一组承诺,然后{{1}解析该数组中的每个promise:
Promise.all()
我注意到MongoDB驱动程序中的.each()方法。它被标记为“已弃用”,但它是否有用,或者我应该坚持.forEach()?
我认为var mongodb = require("mongodb");
var MongoClient = mongodb.MongoClient;
MongoClient
.connect('the_URL_of_my_database')
.then((db) => {
var myCollection = db.collection('my_collection');
myCollection.find({})
.map((document) => {
var selector = { _id: document._id };
var update = { $set: { data: 'my_new_data' } };
return myCollection
.updateOne(selector, update)
.then((response) => {
// this is each resolved updateOne. You don't need
// this `.then` unless you want to post-process
// each individual resolved updateOne result
console.log(response.result);
// return each value to accumulate it in Promise.all.then()
return response.result;
});
})
.toArray() // accumulate the .map returned promises
.then((promises) => Promise.all(promises)) // iterate through and resolve each updateOne promise
.then((resolvedPromises) => {
// an array of all the results returned from each updateOne
console.log(resolvedPromises);
})
.catch((error) => {
// error handle the entire chain.
});
})
.catch((error) => {
// error handle the connection
});
已被弃用,而.each()
与.forEach()
原型保持一致。