Firestore batch.commit一次添加500多个文档

时间:2020-05-20 15:54:07

标签: dart google-cloud-firestore

我是Firestore的新手,试图找出一种使用Dart在Firestore中添加一些文档的快速方法。

我使用了下面的代码。我在列表中大约有3000个字符串,最终添加了所有3000个文档,但是花了很长时间,大约10分钟,并且在batch.commit之后我还收到一条错误消息,即超过了500个限制,甚至尽管它添加了所有3000个文档。

我知道我应该一次将其分解为500个,但是它添加了列表中的所有文档这一事实对我来说没有意义。我在Firestore Console中签入,所有3000个文档都在那里。

每次添加文档时,我都需要创建一个文档ID。我究竟做错了什么?可以使用add来获取文档参考,然后使用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();
  }

1 个答案:

答案 0 :(得分:1)

您的代码实际上只是单独添加每个文档,而不管您对该批处理如何进行。这行代码可以做到:

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

如果您删除该行(再次没有碰到batch),我相信由于批次大小,您只会看到失败。

如果您只是想为要添加到批处理中的文档生成唯一的ID,请使用不带参数的document()

DocumentReference ref = myCollection.document();