Home > database >  Firestore Batch write : 500 maximum writes exceeded
Firestore Batch write : 500 maximum writes exceeded

Time:10-31

I'm using batch write in order to avoid 500 maximum writes limit. Even if I'm using batchArray in order to process more than 500 writes, I get this error:

Exception from a finished function: Error: 3 INVALID_ARGUMENT: maximum 500 writes allowed per request

Code: https://controlc.com/3c3a59be

exports.checkSchedine2 = functions.pubsub
  .schedule('15,45 * * * *')
  .onRun(async (context) => {
    const batch = firestore.batch();
    var currentTime = Math.floor(Date.now() / 1000);

    const risultati = await firestore.collection("Risultati").doc("risultati").get();
    const ref1 = await firestore.collection("Schedine").get();
    let batchArray = [];
    batchArray.push(batch);
    let operationCounter = 0;
    let batchIndex = 0;
    let _notcommit = false;
    await Promise.all(ref1.docs.map(async (doc) => {
      const ref2 = await firestore.collection("Schedine").doc(doc.id).collection("in corso").get();
      for (const doc2 of ref2.docs) {
        const documentData = doc2.data();

        for (matchId in doc2.data()["Match"]) {
          try {
            for (id in risultati.data()) {
              if (matchId == id && risultati.data()[id]["status"] != 0 && doc2.data()["Match"][matchId]["status"] == 0) {
                if ((doc2.data()["Match"][matchId]["Bet"] == 1 || doc2.data()["Match"][matchId]["Bet"] == 2 || doc2.data()["Match"][matchId]["Bet"] == 3) && doc2.data()["Match"][matchId]["Bet"] == risultati.data()[id].ris) {
                  documentData["Match"][matchId]["status"] = 1;
                } else if (doc2.data()["Match"][matchId]["Bet"] == 4 && risultati.data()[id].goal == 1) {
                  documentData["Match"][matchId]["status"] = 1;
                } else if (doc2.data()["Match"][matchId]["Bet"] == 5 && risultati.data()[id].goal == 0) {
                  documentData["Match"][matchId]["status"] = 1;
                } else if (doc2.data()["Match"][matchId]["Bet"] == 6 && risultati.data()[id].over == 1) {
                  documentData["Match"][matchId]["status"] = 1;
                } else if (doc2.data()["Match"][matchId]["Bet"] == 7 && risultati.data()[id].over == 0) {
                  documentData["Match"][matchId]["status"] = 1;
                } else {
                  documentData["Match"][matchId]["status"] = 2;
                }
              }
            }
          } catch (e) {}
        }

        if (_notcommit == false) {
          await batchArray[batchIndex].update(doc2.ref, documentData);
          operationCounter  ;

          if (operationCounter > 100) {
            batchArray.push(batch);
            batchIndex  ;
            operationCounter = 0;
          }
        }
      };
    }));
    Promise.all(batchArray.map(batch => batch.commit()));
  });

It seems that the code launches too many commits, isn't it?

CodePudding user response:

You are pushing the same batch in that batchArray in every iteration. You should be creating a new batch for every 500 operations:

let batchArray = [firestore.batch()];

// ...

if (operationCounter > 100) {
  const newBatch = firestore.batch();
  batchArray.push(newBatch);
  batchIndex  ;
  operationCounter = 0;
}
  • Related