Данные вставляются дважды в mongodb

#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 (я предполагаю, что вы собираетесь обновить каждый из элементов)