【发布时间】:2018-09-13 07:41:51
【问题描述】:
在保存作者之前,我会尝试检查作者是否在 mongo 中。当我通过创建作者函数运行我的第一个 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');
}
});
}
【问题讨论】:
-
你为什么要在
.findOne()电话上排序? -
那是死代码。我现在将其删除。谢谢。
-
这并没有消除双重文档,但无论如何都可以删除它。
-
这不是一个完整的答案,但问题是您的
feedItems.forEach调用是同步的,但 Mongoose 查询操作都是异步的,所以您的所有findOne查询可能在您完成时成功保存您的第一作者(这就是所有作者似乎都是新作者的原因)。 -
太棒了。如果现在一切正常,您可以添加自己的答案并接受它。
标签: javascript mongodb mongoose