2017-10-11 39 views
0

我尝试在MongoDB集合中添加项目。如何在MongoDB集合中添加项目时管理foreach中的承诺

解决这个问题的最好方法是什么?

putAlldata: function(items) { 
return new Promise(function(resolve, reject) { 
    MongoClient.connect(config.dbDelinquency.url, function(err, db) { 
    if (err) { 
     reject(err); 
    } else { 
     resolve(db); 
    } 
    }) 
}).then(function(db) { 
    return new Promise(function(resolve, reject) { 

    var collection = db.collection('data'); 

    items.forEach(function(item) { 
     //console.log(item); 
     db.collection('data').insert(item) 
    }) 
    resolve(items.length); 

    }); 
}); 

}

回答

1

使用Promise.all和Array.map。我asume db.collection.insert返回一个承诺。请让我知道如果它不。

.then(function(db) {  
    return Promise.all(items.map(function(item) { 
     return db.collection('data').insert(item) 
    })) 
    .then(() => items.length); 
    }); 
}); 
0

,而不是项目的数组做.insert每个单项的,你可以使用http://mongodb.github.io/node-mongodb-native/2.2/api/Collection.html#insertMany(insertMany)。

当省略回调时,MongoDB驱动程序也会返回大多数方法的承诺,所以您不需要自己处理promisifying。

你可以重写所有的示例代码为:

return MongoClient.connect(url).then(db => db.collection('data').insertMany(items)); 

如果你真的想要迭代并做.insert独立,您可以创建承诺的数组,并使用Promise.all等待:

return Promise.all(items.map(item => db.collection('data').insert(item))); 
0

您可以使用.insert.insertMany进行批量插入。

return new Promise((resolve, reject) => { 
    const collection = db.collection('data'); 

    try { 
    const results = db.collection.insertMany(items); 
    return resolve(results); 
    } catch (error) { 
    return reject(error); 
    } 
} 

作为一个备注......每次打电话时创建数据库连接都是不好的做法。

0

您结合使用.mapPromise.all所以它会是这样的:

var promises = items.map(item => { 
    return db.collection('data').insert(item) 
}); 
Promise.all(promises).then(...etc 

Promise.all.then可以解决自己的诺言。

相关问题