解析服务器编辑对象上的关系非常慢

时间:2019-01-02 20:52:31

标签: node.js parse-platform parse-server

我具有以下功能,该功能可以在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并允许对其进行操作,例如添加关系。

您不能像使用指针那样在关系查询上使用包含,因此必须单独查询所有关系。排除了指针数组,因为将应用未知数量的标签。

1 个答案:

答案 0 :(得分:1)

可以完成以下几项操作:(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);
  };
}