数据在mongodb中插入两次

时间:2019-03-28 07:50:54

标签: 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 个答案:

答案 0 :(得分:0)

这里有许多观察结果:

您呼叫的部分

element.categories.forEach((category, categoryIndex) => {
    db.Category.findOne({ name: category })

这与项目无关。您正在数据库中查找元素的类别,如果不存在,请保存它们。因此,将对找到的每个项目执行相同的代码。

还要记住这一点:

    db.Category.findOne({ name: category })

将是异步的。 这意味着即使您在项目上循环并执行这段代码,categorySchema.save()的影响也不会反映出来。 (我想这就是你要去的地方。)

我认为更好的方法是插入所有缺少的类别,而不用遍历项目。完成这些操作后,您可以与项目进行比较,并对item.categories进行必要的更改(我假设您将要更新每个项目)