У меня проблемы с производительностью моих запросов 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, меньше обещаний)?