¿Cómo puedo actualizar más de 500 documentos en Firestore usando Batch?

2 minutos de lectura

avatar de usuario
Utkarsh Bhatt

Estoy tratando de actualizar un campo timestamp con el Firestore marca de tiempo del administrador en una colección con más de 500 documentos.

const batch = db.batch();
const serverTimestamp = admin.firestore.FieldValue.serverTimestamp();

db
  .collection('My Collection')
  .get()
  .then((docs) => {
    serverTimestamp,
  }, {
    merge: true,
  })
  .then(() => res.send('All docs updated'))
  .catch(console.error);

Esto arroja un error

{ Error: 3 INVALID_ARGUMENT: cannot write more than 500 entities in a single call
    at Object.exports.createStatusError (C:\Users\Growthfile\Desktop\cf-test\functions\node_modules\grpc\src\common.js:87:15)
    at Object.onReceiveStatus (C:\Users\Growthfile\Desktop\cf-test\functions\node_modules\grpc\src\client_interceptors.js:1188:28)
    at InterceptingListener._callNext (C:\Users\Growthfile\Desktop\cf-test\functions\node_modules\grpc\src\client_interceptors.js:564:42)
    at InterceptingListener.onReceiveStatus (C:\Users\Growthfile\Desktop\cf-test\functions\node_modules\grpc\src\client_interceptors.js:614:8)
    at callback (C:\Users\Growthfile\Desktop\cf-test\functions\node_modules\grpc\src\client_interceptors.js:841:24)
  code: 3,
  metadata: Metadata { _internal_repr: {} },
  details: 'cannot write more than 500 entities in a single call' }

¿Hay alguna manera de que pueda escribir un método recursivo que cree un objeto por lotes actualizando un lote de 500 documentos uno por uno hasta que se actualicen todos los documentos?

De los documentos, sé que la operación de eliminación es posible con el enfoque recursivo como se menciona aquí:

https://firebase.google.com/docs/firestore/manage-data/delete-data#collections

Pero, para actualizar, no estoy seguro de cómo finalizar la ejecución ya que los documentos no se eliminan.

  • ¿Por qué no itera a través de todos los 500 documentos, actualiza y usa la última clave de documento para construir startAt para crear una nueva consulta?

    – Borko Kovacev

    4 sep 2018 a las 11:40

  • Puede limitar y luego procesar por lotes recursivamente, enfrentó el mismo problema y esta fue mi solución: stackoverflow.com/a/61639536/2195000

    – Stathis Ntonas

    7 de mayo de 2020 a las 7:14

  • “usando texto mecanografiado”… No veo ningún texto mecanografiado

    –Matt Fletcher

    16 de marzo de 2021 a las 1:26

  • Esto debería ser parte de la documentación oficial. O al menos algo similar para no depender de lodash. ¡Funciona de maravilla! 🙂

    – Michel K.

    5 de abril de 2021 a las 13:20

  • @MattFletcher loadash escribió en Vanilla JS si desea instalar soporte de tipo @types/lodash

    – tai C

    10 sep 2021 a las 17:54

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad