Работа с производительностью по запросам Parse SDK - PullRequest
0 голосов
/ 28 мая 2020

У меня проблемы с производительностью моих запросов Parse с использованием Parse SDK.

По некоторым запросам мне нужно получить ресурсы, связанные с другим. Например:

  • Я получаю все элементы из ClassA
  • foreach элементы ClassA, мне нужно найти все элементы ClassB и Class C, которые содержат указатель на соответствующую запись в ClassA.

Прямо сейчас, чтобы подвести итог:

  • Я запрашиваю все мои элементы ClassA
  • I l oop по результатам и создаю обещание (Запрос на синтаксический анализ) для получения элементов ClassB и еще один (запрос на синтаксический анализ) для получения элементов класса C для каждого результата

Моя проблема в том, что решение делает много синтаксических запросов, поэтому много обещаний что я должен ждать. Настоящая проблема в том, что на моем локальном env все работает нормально, весь запрос составляет 1 с или меньше (это довольно тяжело, но в текущем случае он выполняет 45 синтаксических запросов - на основе моих записей класса) . На моем производственном сервере тот же код, те же данные, та же версия узла, тот же запрос составляет 30 секунд или более (=> тайм-аут) .

Это соответствующая часть кода (это старый и беспорядочный):

router.get('/:userId/company/customers', (req, res, next) => {
  if('company' in req.jwtData.data) {
    const company = req.jwtData.data.company;
    const query = new Parse.Query('Cards');
    const Companies = Parse.Object.extend('Companies');
    const currentCompany = new Companies({id: company.objectId});
    query.equalTo('company', currentCompany).find().then((cards) => {
      if(cards.length){
        const customersArrayId = cards.map(card => card.toJSON().user.objectId);
        const usersQuery = new Parse.Query('_User').containedIn('objectId', customersArrayId).find({ useMasterKey: true });
        usersQuery.then(customersResponse => {
          const customers = [];
          const customersPromises = [];
          if(customersResponse.length) {
            for (let index = 0; index < customersResponse.length; index++) {
              let customer = {
                ...customersResponse[index].toJSON(),
                ...customersResponse[index].attributes
              }; 
              const customerPromises = [];
              const customerId = customer.objectId;
              const stamps = new Parse.Query('Stamps').equalTo('user', new UserModel({objectId: customerId})).equalTo('company', currentCompany).limit(CONSTANTS.QUERY_MAX_LIMIT).find().then((stamps) => {
                return stamps;
              }).catch(error => {
                res.json({
                  success: false,
                  error
                });
              });
              const cards = new Parse.Query('Cards').equalTo('user', new UserModel({objectId: customerId})).equalTo('company', currentCompany).limit(CONSTANTS.QUERY_MAX_LIMIT).find().then((cards) => {
                return cards;
              }).catch(error => {
                res.json({
                  success: false,
                  error
                });
              });
              customers.push(customer);
              customerPromises.push(stamps);
              customerPromises.push(cards);
              customersPromises.push(customerPromises);
            }
            if(customersPromises.length) {
              const allPromises = customersPromises.map(customerP => Promise.all(customerP));
              Promise.all(allPromises).then((customerPromiseResponses) => {  
                console.log('allPromises done, mapping all users data...');
                for (let index = 0; index < customerPromiseResponses.length; index++) {                  
                  const customerResponseData = customerPromiseResponses[index];
                  const stamps = customerResponseData[0];
                  const cards = customerResponseData[1];
                  const companyEmailAllowed = () => {
                    let check = false;
                    if(customers[index].hasOwnProperty('companiesNewsletterAgreements')) {
                      check = customers[index].companiesNewsletterAgreements.indexOf(company.objectId) > -1;
                    }
                    return check;
                  };
                  customers[index] = {
                    ...customers[index],
                    email: companyEmailAllowed() ? customers[index].email : null,
                    stamps,
                    cards,
                  }
                }                
                res.json({
                  success: true,
                  data: customers
                });
              }).catch(error => {
                res.json({
                  success: false,
                  error
                });
              });
            }
            else {
              res.json({
                success: true,
                data: customers
              });
            }

          } else {
            res.json({
              success: true,
              data: customers
            });
          }



        });
      } else {
        res.json({
          success: true,
          data: []
        });
      }


    });
  } else {
    res.json({
      success: false,
      error: "No company found."
    });
  }
});

Мой вопрос: можно ли получить те же данные более производительным способом (меньше запросов Parse, меньше обещаний)?

1 Ответ

0 голосов
/ 29 мая 2020

Я действительно нашел решение. Вместо того, чтобы запускать запрос Parse для каждого найденного мной результата, я запрашиваю весь набор элементов, которые мне нужны в первую очередь, используя containedIn.

Затем я фильтрую результаты, чтобы назначить элементы их покупателям.

...