MongoDB Поиск запросов медленный при обновлении / вставке схемы - PullRequest
1 голос
/ 30 апреля 2020

Я делаю большой l oop один раз в день - который обновляет существующие документы в базе данных (а также вставляет новые документы).

этот l oop выполняется на отдельном сервере ( не позволяет основному серверу работать медленно), но основная проблема заключается в том, что все запросы поиска к базе данных (пока выполняется l oop) очень медленные (l oop значительно замедляет его).

Это очень большая проблема на моем сайте (этот l oop должен выполняться один раз в день), и я пытался найти решение в Интернете - но мне не удалось найти что-то. Есть ли способ предотвратить слишком медленные запросы поиска при вставке / обновлении базы данных ??

    uploadProductsManually = async (name, products, map, valuesMap) => {
      return new Promise(async function (resolve, reject) {
        const company = await Company.findOne({ name }).exec();
        if (!company) return reject(new errors.NotFound("Company not found"));

        const rows = products;
        const parsedRows = [];

        const findCorrectKey = (key) => {
          const correctKey = key.trim();
          if (productFields[correctKey]) return productFields[correctKey];

          const category = map.find((item) => {
            return item.options.some((option) => {
              return option.trim().toLowerCase() === correctKey.toLowerCase();
            });
          });
          const categoryName = category && category.name;
          return productFields[categoryName];
        };
        const hashProductValues = (product) => {
          let valueToHash;
          if (product.productId) {
            valueToHash = product.productId;
          } else if (product.certificateId) {
            valueToHash = product.certificateId;
          } else {
            valueToHash = JSON.stringify(
              product.size + product.color
            );
          }
          return base64encode(valueToHash);
        };

        rows.forEach(function (row, i) {
          var newProduct = {};
          for (var key in row) {
            var val = row[key];
            if (val) {
              let normalizedKey = findCorrectKey(key);
              if (normalizedKey) {
                newProduct[normalizedKey] = val;
              }
              let normalizedValue = normalizeValue(normalizedKey, val,valuesMap);
 newProduct[normalizedKey] = normalizedValue;
            }
          }
          newProduct.channels = [];
          if (newProduct.productId) {
            parsedRows.push(newProduct);
          }
        });

        fetchProducts();
        function fetchProducts() {
          Product.find({ company: company._id }).exec(function (err, products) {
            if (err) console.log(err);
            var map = {};
            if (products) {
              products.forEach(function (product) {
                const productIdentifier = hashProductValues(product);
                map[productIdentifier] = product;
                if (product.productStatus == "manual") {
                  // product.isAvailable = false;
                  // product.save();
                } else {
                  product.status = "deleted";
                  product.save();
                }
              });
            }
            mergeData(map);
          });
        }

        async function mergeData(map) {
          let created = 0;
          let updated = 0;
          let manual = 0;
          async.each(
            parsedRows,
            function (row, callback) {
              const productIdentifier = hashProductValues(row);
              let product = map[productIdentifier];
              if (product) {
                map[productIdentifier] = undefined;
                Product.findByIdAndUpdate(id, { $set: updatedProduct }, function (
                  err,
                  updatedProd
                ) {
                  if (err) {
                    // errors.push(productIdentifier);
                    console.log("err is:", err);
                  }
                  updated++;
                  callback();
                });
              } else {
                row = new Product(row);
                row.save(function (err) {
                  if (err) {
                    // errors.push(productIdentifier);
                    console.log(err);
                  }
                  created++;
                  callback();
                });
              }
            },
            (err) => {
              if (err) return reject(err);
              Company.findByIdAndUpdate(
                company._id,
                { lastUpdate: new Date() },
                function (err, comp) {
                  if (err) console.log(err);
                }
              );
              console.log(
                `Created: ${created}\nUpdated: ${updated} \manual: ${manual}`
              );
              resolve({
                created,
                updated,
                manual,
                errors,
              });
            }
          );
        }
      });
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...