Посмотри на код и посмотри как можно исправить, чтобы сайт работал быстрее (сейчас он работает ОЧЕНЬ МЕДЛЕННО). Размер моего json файла 350 мегабайт. надо как-то data.json в mongodb перевести. Добавь чтение из json файла и перевод этого в mongodb, так как у меня более 55 тысяч страниц записаны в data.json

const express = require("express");
const ejs = require("ejs"); 
const fs = require("fs");
const request = require("request");
const cheerio = require("cheerio");

const app = express();

// Установка EJS в качестве шаблонизатора
app.set('view engine', 'ejs');

// Функция для получения HTML-кода страницы
function getHtml(url) {
  return new Promise((resolve, reject) => {
    request(url, (error, response, html) => {
      if (error) {
        reject(error);
      } else {
        resolve(html);
      }
    });
  });
}

// Функция для получения номеров телефонов и сохранения их в файле data.json
async function getNewPhoneNumbers() {
  console.log("Запущен процесс поиска новых номеров...");

  const phoneNumbers = JSON.parse(fs.readFileSync("data.json"));
  const lastPageUrl = phoneNumbers.length > 0 ? phoneNumbers[0].url : null;
  const newPhoneNumbers = [];

  // Получить HTML-код первой страницы с номерами телефонов
  const firstPageUrl = "https://zvonili.com/";
  const firstPageHtml = await getHtml(firstPageUrl);

  // Использовать Cheerio для парсинга HTML-кода и извлечения информации о номере телефона
  const $firstPage = cheerio.load(firstPageHtml);
  const phoneElements = $firstPage(".card-header");

  phoneElements.each((index, element) => {
    const phoneNumber = $firstPage(element).find(".nomerlnk").text().trim();
    const url = $firstPage(element).find(".nomerlnk").attr("href");
    const comments = $firstPage(element).next().find("blockquote").text().trim().replace(/\s*[\[\(]?\s*(Опросы|Реклама|Мошенники)\s*[\]\)]?\s*/gi, '');
    const callTypeElements = $firstPage(element).next().find("span.type");
    const callType = callTypeElements.length > 0 ? callTypeElements.map((index, element) => $firstPage(element).text().trim()).get().join(", ") : "";

    // Добавить новый номер телефона в массив, если его еще нет в списке
    if (!phoneNumbers.some((phone) => phone.number === phoneNumber)) {
      newPhoneNumbers.push({ number: phoneNumber, url: url, comments: [comments], callType: callType });
    }
  });

  console.log(`Найдено ${newPhoneNumbers.length} новых номеров телефонов.`);

  // Сохранить новые номера телефонов в начало файла data.json
  const updatedPhoneNumbers = [...newPhoneNumbers, ...phoneNumbers];
  fs.writeFileSync("data.json", JSON.stringify(updatedPhoneNumbers, null, 2));

  return newPhoneNumbers;
}

// Создать маршрут для страницы с информацией о номере телефона
app.get("/phone/:number", (req, res) => {
  const phoneNumbers = JSON.parse(fs.readFileSync("data.json"));
  const phoneNumber = phoneNumbers.find((phone) => phone.number === req.params.number);

  if (phoneNumber) {
    const data = {
      number: phoneNumber.number,
      comments: phoneNumber.comments,
      callType: phoneNumber.callType,
    };
    res.render('phone', data);
  } else {
    res.status(404).send("Номер телефона не найден");
  }
});

// Маршрут для главной страницы
app.get("/", (req, res) => {
  const phoneNumbers = JSON.parse(fs.readFileSync("data.json"));
  const data = {
    phoneNumbers: phoneNumbers,
  };
  const html = ejs.render(fs.readFileSync("views/index.ejs", "utf8"), data);
  
  res.send(html);
});

// Запуск сервера и поиск новых номеров телефонов каждые 10 минут
const searchInterval = 10 * 60 * 1000; // 10 минут в миллисекундах
app.listen(3000, () => {
  console.log("Сервер запущен на порту 3000");
  getNewPhoneNumbers();
  setInterval(getNewPhoneNumbers, searchInterval);
});