Parse Server редактирует отношения на объекте очень медленно - PullRequest
0 голосов
/ 02 января 2019

У меня есть следующая функция, которая работает, как и ожидалось, в облачном коде Parse Server, но она очень медленная.

Вложенные циклы for, которые являются внутренне вызывающими запросами и сохраняют функции, несомненно, являются основной причиной.

Как я могу реорганизовать этот код так, чтобы была некоторая асинхронная обработка или, что еще лучше, какие есть методы для удаления / редактирования отношений на объекте, документация вокруг этого очень плохая.

ClientLabels.applyClientLabels = async (req, res) => {

  const { clients, labels } = req.params;
  const user = req.user;
  const objectIds = clients.map((client) => client.objectId);
  const clientSaveList = [];
  const clientClass = Parse.Object.extend('Clients');
  const query = new Parse.Query(clientClass);
  query.containedIn("objectId", objectIds);
  const queryResult = await query.find({ sessionToken: user.getSessionToken() })

  try {
    for (const client of queryResult) {

      const labelRelation = client.relation('labels');
      const relatedLabels = await labelRelation.query().find({ sessionToken: user.getSessionToken() });
      labelRelation.remove(relatedLabels);

      for (const label of labels) {
        label.className = "ClientLabels";
        const labelRelationObj = Parse.Object.fromJSON(label)
        labelRelation.add(labelRelationObj);
      };
      clientSaveList.push(client);
    };

    const saved = await Parse.Object.saveAll(clientSaveList, { sessionToken: user.getSessionToken() })
    res.success(saved);

  } catch (e) {
    res.error(e);
  };
}

Объяснение некоторой странности: мне нужно вызвать Parse.Object.fromJSON, чтобы сделать объект метки на стороне клиента ParseObjectSubClass и разрешить операции над ним, такие как добавление отношений.

Вы не можете использовать include в запросе отношений, как если бы вы указывали с помощью Pointer, поэтому должен быть запрос для отношений самостоятельно.Массив указателей был исключен, так как будет применено неизвестное количество меток.

1 Ответ

0 голосов
/ 04 января 2019

Есть несколько вещей, которые можно сделать: (1) Создание меток во внутреннем цикле инвариантно относительно внешнего цикла, так что это можно сделать один раз, в начале.(2) Нет необходимости запрашивать отношение, если вы просто собираетесь удалить связанные объекты.Используйте unset() и добавьте, чтобы заменить отношения.(3) Это не сэкономит много вычислений, но clientSaveList излишне, мы можем просто сохранить результат запроса ...

ClientLabels.applyClientLabels = async (req, res) => {
  const { clients, labels } = req.params;    
  const objectIds = clients.map((client) => client.objectId);
  let labelObjects = labels.map(label => {
    label.className = "ClientLabels";
    return Parse.Object.fromJSON(label)
  });
  const query = new Parse.Query('Clients');
  query.containedIn("objectId", objectIds);
  const sessionToken = req.user.getSessionToken;
  const queryResult = await query.find({ sessionToken: sessionToken })

  try {
    for (const client of queryResult) {
      client.unset('labels');
      client.relation('labels').add(labelObjects);
    };
    const saved = await Parse.Object.saveAll(queryResult, { sessionToken: sessionToken })
    res.success(saved);
  } catch (e) {
    res.error(e);
  };
}
...