INVALID_ARGUMENT: максимум 500 записей разрешено на запрос - Firebase Cloud Function - Firestore - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь запустить приведенный ниже код в облачной функции Firebase. Я пытаюсь выполнить l oop через все документы внутри коллекции Firestore под названием savedData, проанализировать JSON, хранящуюся в виде строки в каждом документе, а затем сохранить проанализированные данные в новом документе в коллекции под названием stgPicks. Каждый документ из коллекции savedData должен создавать где-то от 50 до 100 новых документов в коллекции stgPicks.

Когда я пытаюсь запустить функцию, я получаю следующий код ошибки.

Может ли кто-нибудь помочь отладить этот код? Я не уверен, правильно ли обрабатываю пакет.

Error: 3 INVALID_ARGUMENT: maximum 500 writes allowed per request
    at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:30:26)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:175:52)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:341:141)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:304:181)
    at Http2CallStream.outputStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:115:74)
    at Http2CallStream.maybeOutputStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:154:22)
    at Http2CallStream.endCall (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:140:18)
    at Http2CallStream.handleTrailers (/workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:265:14)
    at ClientHttp2Stream.emit (events.js:198:13)
    at ClientHttp2Stream.EventEmitter.emit (domain.js:466:23)
exports.parsePicksRecover = functions.https.onRequest((req, res) => {
  let savedDataRef = admin.firestore().collection('savedData')
  let allDrafts = savedDataRef
    .get()
    .then((snapshot) => {
      snapshot.forEach((doc) => {
        const docId = doc.id
        const getDoc = admin
          .firestore()
          .collection('savedData')
          .doc(`${docId}`)
          .get()
          .then((doc) => {
            if (!doc.exists) {
              console.log('No matching document.')
            } else {
              const response = doc.data().data_json.replace(`,]`, `]`).replace(`,}`, `}`)
              const data = JSON.parse(response)
              const draft = data.draft
              const draftId = draft.draftid
              const draftYear = docId.substring(0, 4)
              let paramsStatic = {
                draftid: draftId,
                datetime: draft.datetime,
                myteam: draft.myteam,
                user: draft.user,
                draftyear: draftYear
              }

              const batchArray = []
              const batch = admin.firestore().batch()
              batchArray.push(batch)
              let operationCounter = 0
              let batchIndex = 0

              draft.picks.forEach((data) => {
                let paramsVar = {
                  teamid: data.teamid,
                  teamshortname: data.teamshortname,
                  fullname: data.fullname,
                  position: data.position,
                  school: data.school,
                  round: data.round,
                  ovrpick: data.ovrpick,
                  rdpick: data.rdpick,
                  createDate: admin.firestore.FieldValue.serverTimestamp()
                }
                let params = { ...paramsStatic, ...paramsVar }

                let writeResult = admin
                  .firestore()
                  .collection('stgPicks')
                  .doc(`${draftYear}|${draftId}|${data.ovrpick}`)
                batchArray[batchIndex].set(writeResult, params)
                operationCounter++
                if (operationCounter === 499) {
                  batchArray.push(firestore.batch())
                  batchIndex++
                  operationCounter = 0
                }
              })

              batchArray.forEach(async (batch) => await batch.commit())
              return
            }
          })
          .catch((err) => {
            console.log('Error getting document', err)
          })
      })
    })
    .catch((err) => {
      console.log('Error getting documents', err)
    })
})

Журнал ошибок Firebase

1 Ответ

0 голосов
/ 19 июня 2020

Я столкнулся с той же ошибкой, используя PHP SDK, и в моем случае проблема была после фиксации, которая мне нужна для создания нового экземпляра batch, иначе я думаю, что он пытается зафиксировать изменения старого документа дважды и вот почему вы работаете с максимальным количеством записей 500, разрешенных на одну ошибку запроса, например:

let batch = admin.firestore().batch();

for (i = 1; i <= 10000; ++i) {
     // do something with the batch


     if (0 === i % 500) {
          batch.commit();
          batch = admin.firestore().batch();
     }
}


batch.commit();
...