Когда я делаю db-процесс внутри функции карты asyn c, я не могу избежать дублирования - PullRequest
0 голосов
/ 30 января 2020

Я хочу добавить штрих-код паллета в поле записи palletBarcodes. Но есть проверка, чтобы избежать добавления того же паллет-кода. Я использую функцию ниже. Но проверка не работает внутри функции карты asyn c.

myService. js

    const palletBarcodes = ["TP2","TP2"]
    await Promise.all(palletBarcodes.map(async (palletBarcode) => {
      const promise = await this.addPalletBarcode({ transferId, barcode: palletBarcode });
      return promise;
    }));

async addPalletBarcode({ transferId, barcode, pickerId }) {
    const { TransferDataAccess } = this;

    const transfer = await TransferDataAccess.getTransfer({ transferId });

    if (!transfer) {
      throw new TransferNotFoundError();
    }

    if (transfer.palletBarcodes.length && transfer.palletBarcodes.includes(barcode)) {
      throw new PalletBarcodeAlreadyExistsError({ barcode });
    }

    return TransferDataAccess.pushPalletBarcode({ transferId, barcode });
  }

TransferDataAccess:

  async pushPalletBarcode({ transferId, barcode }) {
    const { TransferModel } = this;

    return TransferModel
      .findOneAndUpdate({
        _id: transferId,
      },
      {
        $push: {
          palletBarcodes: barcode,
        },
      })
      .lean()
      .exec();
  }

1 Ответ

0 голосов
/ 30 января 2020

Вместо $push используйте $addToSet. $addToSet будет обрабатывать ваш ключ в документе как набор, и это автоматически исключает дубликаты.

Ваш запрос затем станет -

TransferModel.findOneAndUpdate(
  { _id: transferId },
  { $addToSet: { palletBarcodes: barcode } }
);
...