#node.js #mongodb
#node.js #mongodb
Вопрос:
Я читаю файл 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))
})
}
}
});
}
})
});
Комментарии:
1. Я новичок в node js, я также пробовал использовать async await, но он работал как одинаковые повторяющиеся записи.
Ответ №1:
Здесь есть ряд замечаний:
Раздел, в котором вы вызываете
element.categories.forEach((category, categoryIndex) => {
db.Category.findOne({ name: category })
Это не зависит от элемента. Вы ищете категории элементов в базе данных и сохраняете их, если они не существуют. Таким образом, этот же фрагмент кода будет выполняться для каждого найденного вами элемента.
Кроме того, помните об этом:
db.Category.findOne({ name: category })
будут асинхронными.
Это означает, что даже если вы выполняете цикл по элементам и выполняете этот фрагмент кода, влияние categorySchema.save() не отразится. (Я предполагаю, что это то, к чему вы стремились здесь.)
Я думаю, что лучшим способом сделать это было бы просто вставить все недостающие категории без перебора элементов. После завершения этих операций вы можете выполнить сравнения с элементами и внести необходимые изменения в item.categories (я предполагаю, что вы собираетесь обновить каждый из элементов)