求nodejs sequelize ORM mysql操作的精简的方案

有一个查库动作,三个库

一个 MpLabel 标签库,这个库是用户在新增标签的时候插入的
一个 MpLabelCard 卡片标签库
一个 MpLabelCardLog 日志库

三个库的流程是
step1.首先查询标签库中数据,如果没有该标签新建标签,并获得标签ID
step2.从名片标签库中查找所有名片的标签,如果没有符合条件的则新建
step3.如果labelCard有该数据,为标签合计数据数据自增量1

目前写的操作动作是


const name = ctx.request.body.labels;   // 这里会进来5个标签
      const uid = ctx.request.body.uid;
      const cid = ctx.request.body.cid;
      const cardsn = ctx.request.body.cardsn;
      const time = Math.round(new Date().getTime() / 1000);

      for (const i in name) {
        // 添加标签  step1.首先查询标签库中数据,如果没有该标签新建标签,并获得标签ID
        const res = yield this.ctx.model.MpLabel.findOrCreate({
          where: {
            name: name[i],
          },
          defaults: {
            name: name[i],
            card_sn: cardsn,
            tm: time,
          },
        });
        // 添加关系 step2.从名片标签库中查找所有名片的标签,如果没有符合条件的则新建
        const labelCard = yield this.ctx.model.MpLabelCard.findOrCreate({
          where: {
            card_sn: cardsn,
            lid: res[0].dataValues.id,
            cid,
          },
          defaults: {
            card_sn: cardsn,
            lid: res[0].dataValues.id,
            count: 0,
            cid,
          },
        });
        // step3.如果labelCard有该数据,为标签合计数据数据自增量1
        if (labelCard[0].isNewRecord === false) {
          yield this.ctx.model.MpLabelCard.increment({
            count: 1,
          }, {
            where: {
              card_sn: cardsn,
              lid: res[0].dataValues.id,
            },
          });
          // step4.如果没有该标签,新建标签数据
        }
        // 进行日志保存
        yield this.ctx.model.MpLabelCardLog.create({
          lid: res[0].dataValues.id,
          card_sn: cardsn,
          uid,
          cid,
          tm: time,
        });
      }

统计了一下,用户如果添加5个标签,耗时2s

是否可以精简或者有更优化的方案?

阅读 2.6k
1 个回答
const promiseArr = []
for(const i in name) {
    promiseArr.push(new Promise((resolve,reject) => {
        yield a;
        yield b;
        yield c;
        yield d;
        resolve(e);
    }))
}
Promise.all(promiseArr).then(resArr => {})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进