嗨,我正在写一个更新mongodb数据库的脚本。我的脚本执行以下操作。
DB。
由于mongodb API的异步特性,我不得不使用Promises。但我不能通过承诺来实现这一点。以下是我的代码。
// a array that stores the file Json objects
var fileJsonArray = [];
//passing the filePath twice as one serves as the source for the icons and the other is the base location.
//Check the documentaion for the file for more details
directoryParser.parseDirectory(...);
//console.log(fileJsonArray);
//connect to db
var mongoose = mongoose || require('mongoose');
mongoose.Promise = require('bluebird');
var dbUrl = 'mongodb://'+ config.dbLocation + ':' + config.dbPort + '/' + config.dbName;
mongoose.connect(dbUrl);
// an array that contains all the promises
var promises = [];
//console.log(fileJsonArray);
// get all the element
promises.push(File.find({}).exec()
.catch(function(err){
console.error('Error while getting all elements',err);
})
.then(function(err, allElements) {
if(err) {
console.error(err);
} else {
console.log(fileJsonArray);
for (var i = 0; i < fileJsonArray.length; i++) {
console.log(fileJsonArray[i].name);
if(fileJsonArray[i] in allElements) {
var query = {name : fileJsonArray[i].name, tags: fileJsonArray[i].tags}
, update = {size : fileJsonArray[i].size, bmarkedasdeleted: true}
, options = {multi: false};
promises.push(File.update(query, update, options).exec());
allElements.splice(allElements.indexOf(fileJsonArray[i]),1);
} else {
promises.push(fileJsonArray[i].save(function(err) {
if(err) {
console.error(fileJsonArray, err);
}
}));
}
}
for (var i = 0; i < allElements.length; i++) {
var query = {name : allElements[i].name, tags: allElements[i].tags}
, update = {bmarkedasdeleted: false}
, options = {multi: false};
promises.push(File.update(query, update, options).exec());
}
}
}));
//console.log(promises);
Promise.all(promises).then(function() {
mongoose.disconnect();
console.log('Disconnect Mongoose.');
}).catch(function(err){
console.log(err);
});
现在我不能保存任何值,因为find({}).exec()的fileJsonArray是空的。
请给我建议。如果需要澄清,也要添加一些注释。
发布于 2016-08-26 16:24:40
File.find({}).exec()
.then((allElements) => {
var promises = [];
for (var i = 0; i < fileJsonArray.length; i++) {
if (fileJsonArray[i] in allElements) {
var query = {name : fileJsonArray[i].name, tags: fileJsonArray[i].tags}
, update = {size : fileJsonArray[i].size, bmarkedasdeleted: true}
, options = {multi: false};
promises.push(File.update(query, update, options).exec());
allElements.splice(allElements.indexOf(fileJsonArray[i]), 1);
} else {
promises.push(fileJsonArray[i].save());
}
}
for (var i = 0; i < allElements.length; i++) {
var query = {name : allElements[i].name, tags: allElements[i].tags}
, update = {bmarkedasdeleted: false}
, options = {multi: false};
promises.push(File.update(query, update, options).exec());
}
return Promise.all(promises);
}).then(() => {
mongoose.disconnect();
console.log('Disconnect Mongoose.');
}).catch((err) => {
console.log(err);
});
因为Promise.all
会返回所有已解决的承诺。您应该先执行File.find
promise,然后再收集其他promise。请记住,只有在解决了File.find promise之后,您才能获得其他promise。
https://stackoverflow.com/questions/38977089
复制相似问题