How to create/update multiple documents at once in Firestore

后端 未结 4 1112
忘掉有多难
忘掉有多难 2020-12-01 12:00

Is it possible to store multiple documents in Firestore with only one request? With this loop it\'s possible but this would cause one save operation per item in the list.

相关标签:
4条回答
  • 2020-12-01 12:23
    void createServiceGroups() {
            List<String> serviceGroups = [];
    
            serviceGroups.addAll([
              'Select your Service Group',
              'Cleaning, Laundry & Maid Services',
              'Movers / Relocators',
              'Electronics & Gadget',
              'Home Improvement & Maintenance',
              'Beauty, Wellness & Nutrition',
              'Weddings',
              'Food & Beverage',
              'Style & Apparel',
              'Events & Entertainment',
              'Photographer & Videographers',
              'Health & Fitness',
              'Car Repairs & Maintenance',
              'Professional & Business Services',
              'Language Lessons',
              'Professional & Hobby Lessons',
              'Academic Lessons',
            ]);
            Firestore db = Firestore.instance;
            // DocumentReference ref = db
            //     .collection("service_groups")
            //     .document(Random().nextInt(10000).toString());
    
            // print(ref.documentID);
    
            // Get a new write batch
    
            for (var serviceGroup in serviceGroups) {
              createDocument(db, "name", serviceGroup);
            }
    
            print("length ${serviceGroups.length}");
          }
    
          createDocument(Firestore db, String k, String v) {
            WriteBatch batch = db.batch();
            batch.setData(db.collection("service_groups").document(), {k: v});
            batch.commit();
          }
    

       createDocument(Firestore db, String k, String v) {
                WriteBatch batch = db.batch();
                batch.setData(db.collection("service_groups").document(), {k: v});
                batch.commit();
              }
    

    This may help you:

     for (var serviceGroup in serviceGroups) {
          createDocument(db,  "name", serviceGroup  );
        }
    
    0 讨论(0)
  • 2020-12-01 12:27

    From Firebase documentation :

    You can also execute multiple operations as a single batch, with any combination of the set(), update(), or delete() methods. You can batch writes across multiple documents, and all operations in the batch complete atomically.

    // Get a new write batch
    WriteBatch batch = db.batch();
    
    // Set the value of 'NYC'
    DocumentReference nycRef = db.collection("cities").document("NYC");
    batch.set(nycRef, new City());
    
    // Update the population of 'SF'
    DocumentReference sfRef = db.collection("cities").document("SF");
    batch.update(sfRef, "population", 1000000L);
    
    // Delete the city 'LA'
    DocumentReference laRef = db.collection("cities").document("LA");
    batch.delete(laRef);
    
    // Commit the batch
    batch.commit().addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            // ...
        }
    });
    

    Firestore multiple write operations

    Hope it helps..

    0 讨论(0)
  • 2020-12-01 12:32

    Update some properties on all documents in a collection:

    resetScore(): Promise<void> {
      return this.usersCollectionRef.ref.get().then(resp => {
        console.log(resp.docs)
        let batch = this.afs.firestore.batch();
    
        resp.docs.forEach(userDocRef => {
          batch.update(userDocRef.ref, {'score': 0, 'leadsWithSalesWin': 0, 'leadsReported': 0});
        })
        batch.commit().catch(err => console.error(err));
      }).catch(error => console.error(error))
    }
    
    0 讨论(0)
  • 2020-12-01 12:34

    If you are in the need to use add() instead of set, please follow the code below,

    public void createMany(List<T> datas) throws CustomException {
        Firestore firestore = connection.firestore();
        CollectionReference colRef = firestore.collection("groups");
    
        WriteBatch batch = firestore.batch();
        for (T data : datas) {
            batch.create(colRef.document(), data);
        }
    
        ApiFuture<List<WriteResult>> futureList = batch.commit();
        try {
            for (WriteResult result : futureList.get()) {
                logger.debug("Batch output: {}", result.getUpdateTime());
            }
        } catch (InterruptedException | ExecutionException e) {
            throw new CustomException(500, e.getMessage());
        }
    }
    

    This might be useful when you are in the need to generate the id from the firestore db.

    0 讨论(0)
提交回复
热议问题