我正在读取json文件,并检查到产品文档是否在我的文档中已经有品牌,如果对于品牌来说假设找到了多个产品,那么我正在遍历产品并检查类别文档中的类别。如果类别不存在,那么我将在类别文档中创建新文档。但是,如果产品找到3次,则新类别分别创建3次。有人可以帮我吗?
下面是我的代码
jsonData.products.forEach((element, index) => {
//get data from database which have same product
db.Product
.find({ brand: element.brand })
.then(product => {
if (product.length > 0) {
product.forEach((item, productIndex) => {
//Check product title greater than 70 %
// var similarity = stringSimilarity.compareTwoStrings(element.name, item.title);
var similarity = stringSimilarity.compareTwoStrings("surat rawal", "surat rawal prem");
// console.log(element.name, item.title);
if (similarity > 0.7) {
//if categoris found in json file
let newCategory = {};
if (element.categories) {
element.categories.forEach((category, categoryIndex) => {
db.Category
.findOne({
name: category
})
.then(categoryData => {
if (categoryData) {
const categoryObj = item.categories.find(categoryEle => {
return categoryEle.name === categoryData.name;
});
//If category not found on product then add category
if (!categoryObj) {
newCategory.id = categoryData._id;
newCategory.name = categoryData.name;
item.categories.push(newCategory);
}
} else {
//If category is not already there then add new one
const categorySchema = new db.Category({ name: category });
categorySchema
.save()
.then(insertedCategory => {
newCategory.id = insertedCategory._id;
newCategory.name = insertedCategory.name;
item.categories.push(newCategory);
})
.catch(err => {
throw err
})
}
})
.catch(err => console.log(err))
})
}
}
});
}
})
});
答案 0 :(得分:0)
这里有许多观察结果:
您呼叫的部分
element.categories.forEach((category, categoryIndex) => {
db.Category.findOne({ name: category })
这与项目无关。您正在数据库中查找元素的类别,如果不存在,请保存它们。因此,将对找到的每个项目执行相同的代码。
还要记住这一点:
db.Category.findOne({ name: category })
将是异步的。 这意味着即使您在项目上循环并执行这段代码,categorySchema.save()的影响也不会反映出来。 (我想这就是你要去的地方。)
我认为更好的方法是插入所有缺少的类别,而不用遍历项目。完成这些操作后,您可以与项目进行比较,并对item.categories进行必要的更改(我假设您将要更新每个项目)