Я купила попытку проверить, есть ли автор в монго, прежде чем я сохраню автора. Когда я запускаю свой первый rss-документ с помощью функции создания автора, все авторы сохраняются в БД - даже если они создали два элемента в фиде.
Что странно, что если я снова запустил фид, мангуста, похоже, осознает, что авторы уже существуют и не добавляют их снова. Может кто-нибудь, пожалуйста, объясните мне, что происходит?
function insertFeedItems(feedItems, newFeedID, callback) {
feedItems.forEach((item) => {
let firstName = item.author.substr(0, item.author.indexOf(' '));
let lastName = item.author.substr(item.author.indexOf(' ') + 1);
authorController.createAuthorInternally(firstName, lastName, function(author) {
let aid = author.id;
categoryController.createCategoryInternally(item.categories, function(categories) {
// console.log('author: '+aid);
// console.log('categories: '+categories);
});
});
});
}
exports.createAuthorInternally = (firstName, lastName, callback) => {
let author = authorFilter.validateAuthor(firstName, lastName);
let queryParams = {
$and: [{firstName: {$regex: firstName, $options: 'i'}},
{lastName: {$regex: lastName, $options: 'i'}}],
};
let query = Author.findOne(queryParams).sort([['lastName', 'ascending']]);
let findAuthor = query.exec();
findAuthor.then((foundAuthor)=> {
if (foundAuthor === null) {
f1();
}
});
function saveGuy() {
return new Promise((resolve) => {
let insertNewAuthor = author.save();
resolve(insertNewAuthor);
});
}
async function f1() {
var name = await saveGuy();
}
};
Изменение: я пробовал это по-другому:
Author.count(({'firstName': firstName}, { 'lastName': lastName }), function (err,count) {
console.log(firstName + " " + lastName + " " + count);
if(count === 0){
f1();
}
});
function saveGuy() {
return new Promise((resolve) => {
let insertNewAuthor = author.save();
resolve(insertNewAuthor);
});
}
async function f1() {
var name = await saveGuy();
}
При первом запуске этого нового метода выход:
Jon Brodkin 0
Peter Bright 0
Timothy B. Lee 0
Samuel Axon 0
Kyle Orland 0
Jon Brodkin 0
Kyle Orland 0
Megan Geuss 0
Cyrus Farivar 0
Peter Bright 0
Jim Resnick 0
Cyrus Farivar 0
Kyle Orland 0
Beth Mole 0
Ars Staff 0
Megan Geuss 0
Cyrus Farivar 0
John Timmer 0
Kyle Orland 0
Samuel Axon 0
На втором запуске с тем же rss-каналом:
Cyrus Farivar 3
Jon Brodkin 2
Kyle Orland 4
Megan Geuss 2
Jon Brodkin 2
Ars Staff 1
Peter Bright 2
Jim Resnick 1
Peter Bright 2
Kyle Orland 4
Megan Geuss 2
Cyrus Farivar 3
Timothy B. Lee 1
Samuel Axon 2
Kyle Orland 4
Beth Mole 1
Cyrus Farivar 3
John Timmer 1
Kyle Orland 4
Samuel Axon 2
Что касается предложения щедрости, это метод, который я использую, чтобы найти и сохранить:
exports.createAuthorInternally = (firstName, lastName, callback) => {
let query = Author.findOne({firstName: firstName,lastName: lastName});
query.exec(function(err,doc) {
if(err){console.log(err)}
if(!doc){
let auth = new Author({firstName: firstName, lastName: lastName});
auth.save(auth, function(err,newdoc) {
if(err){console.log(err)}
callback(newdoc);
});
}else{
callback(doc);
}
});
Результаты те же, что и в предыдущих методах.
Изменение: JohnnyHK указал на мою ошибку. Я скорректировал код, чтобы отразить его ответ:
function insertFeedItems(feedItems,newFeedID){
async.eachSeries(feedItems, function(item, eachCallBack) {
let firstName = item.author.substr(0, item.author.indexOf(' '));
let lastName = item.author.substr(item.author.indexOf(' ') + 1);
async.waterfall([
(callback) => {
authorController.createAuthorInternally(firstName, lastName, function(author) {
return callback(null, author, item.categories);
});
},
(author, categories, callback) => {
categoryController.createCategoryInternally(categories, function(categories) {
return callback(null, author, categories);
});
},
(author, categories, callback) => {
feedEntryController.createFeedEntry(item, author, categories, function(entry) {
return callback(null, author, categories, entry);
});
},
],
function(waterfallError) {
if(!waterfallError){
eachCallBack();
}
});
}, function(eachSeriesErr) {
if(eachSeriesErr) {
console.log('An item failed to process');
} else {
console.log('All items have been processed successfully');
}
});
}
JohnnyHK указал на мою ошибку. Используя библиотеку, Async - я скорректировал код, чтобы отразить его ответ:
function insertFeedItems(feedItems,newFeedID){
async.eachSeries(feedItems, function(item, eachCallBack) {
let firstName = item.author.substr(0, item.author.indexOf(' '));
let lastName = item.author.substr(item.author.indexOf(' ') + 1);
async.waterfall([
(callback) => {
authorController.createAuthorInternally(firstName, lastName, function(author) {
return callback(null, author, item.categories);
});
},
(author, categories, callback) => {
categoryController.createCategoryInternally(categories, function(categories) {
return callback(null, author, categories);
});
},
(author, categories, callback) => {
feedEntryController.createFeedEntry(item, author, categories, function(entry) {
return callback(null, author, categories, entry);
});
},
],
function(waterfallError) {
if(!waterfallError){
eachCallBack();
}
});
}, function(eachSeriesErr) {
if(eachSeriesErr) {
console.log('An item failed to process');
} else {
console.log('All items have been processed successfully');
}
});
}
.findOne()
?