live-love
live-love

Reputation: 52366

Firestore batch.commit adding more than 500 documents at a time

I am new to Firestore, trying to figure out a fast way to add some documents in Firestore using Dart.

I used the code below. I had about 3000 strings in a list, and it ended up adding all the 3000 documents, but it took a long time, about 10 minutes, and I also got an error message after batch.commit, that the 500 limit was exceeded, even though it added all 3000 documents.

I know I should break it down into 500 at a time, but the fact that it added all the documents in the list does not make sense to me. I checked in Firestore Console, and all the 3000 documents were there.

I need to create a document id every time I add a document. What am I doing wrong? Is it ok to use the add to get a document reference, and then batch.setData?

 Future<void> addBulk(List<String> stringList) async {
    WriteBatch batch = Firestore.instance.batch();

    for (String str in stringList) {
      // Check if str already exists, if it does not exist, add it to Firestore
      if (str.isNotEmpty) {
        QuerySnapshot querySnapshot = await myCollection
            .where('name', isEqualTo: str)
            .getDocuments(source: Source.cache);
        if (querySnapshot.documents.length == 0) {
          UserObject obj = UserObject(name: str);
          DocumentReference ref = await myCollection.add(obj.toMap());
          batch.setData(ref, UserObject.toMap(), merge: true);
        }
      }
    }
    batch.commit();
  }

Upvotes: 0

Views: 144

Answers (1)

Doug Stevenson
Doug Stevenson

Reputation: 317467

Your code is actually just adding each document separately, regardless of what you're doing with the batch. This line of code does it:

DocumentReference ref = await myCollection.add(obj.toMap());

If you remove that line (which, again, is not touching your batch), I'm sure you will just see a failure due to the batch size.

If you are just trying to generate a unique ID for the document to be added in the batch, use document() with no parameters instead:

DocumentReference ref = myCollection.document();

Upvotes: 1

Related Questions