Saltar al contenido

Cómo hacer una actualización masiva en Firestore

Recuerda que en la informática cualquier problema casi siempere puede tener diferentes soluciones, de igual modo nosotros enseñamos lo más óptimo y mejor.

Solución:

Si usó la base de datos de Firebase, no fue posible escribir atómicamente en ubicaciones separadas completamente únicas, es por eso que tendría que usar escrituras por lotes, lo que significa que todas las operaciones tienen éxito o ninguna de ellas se aplica.

Con respecto a Firestore, todas las operaciones ahora se procesan atómicamente. Sin embargo, puede ejecutar varias operaciones de escritura como un solo lote que contenga cualquier combinación de operaciones set(), update() o delete(). Un lote de escrituras se completa de forma atómica y puede escribir en varios documentos.

Este es un ejemplo simple con respecto a una operación por lotes para la operación de escritura, actualización y eliminación.

WriteBatch batch = db.batch();

DocumentReference johnRef = db.collection("users").document("John");
batch.set(johnRef, new User());

DocumentReference maryRef = db.collection("users").document("Mary");
batch.update(maryRef, "Anna", 20); //Update name and age

DocumentReference alexRef = db.collection("users").document("Alex");
batch.delete(alexRef);

batch.commit().addOnCompleteListener(new OnCompleteListener() 
    @Override
    public void onComplete(@NonNull Task task) 
        // ...
    
);

Vocación commit() El método en el objeto del lote significa que confirma todo el lote.

Estaba buscando una solución, no encontré ninguna, así que hice esta, si alguien está interesado.

public boolean bulkUpdate() 
  try 
    // see https://firebase.google.com/docs/firestore/quotas#writes_and_transactions
    int writeBatchLimit = 500;
    int totalUpdates = 0;

    while (totalUpdates % writeBatchLimit == 0) 
      WriteBatch writeBatch = this.firestoreDB.batch();

      List documentsInBatch =
          this.firestoreDB.collection("animals")
              .whereEqualTo("species", "cat")
              .limit(writeBatchLimit)
              .get()
              .get()
              .getDocuments();

      if (documentsInBatch.isEmpty()) 
        break;
      

      documentsInBatch.forEach(
          document -> writeBatch.update(document.getReference(), "hasTail", true));

      writeBatch.commit().get();

      totalUpdates += documentsInBatch.size();
    

    System.out.println("Number of updates: " + totalUpdates);

   catch (Exception e) 
    return false;
  
  return true;

Te invitamos a defender nuestra tarea poniendo un comentario o puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *