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

标签 dart google-cloud-firestore

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

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

我知道我应该一次将其分解为500个,但是事实证明它添加了列表中的所有文档。我在Firestore Console中 checkin ,所有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();
  }

最佳答案

实际上,您的代码只是单独添加每个文档,而与批处理无关。这行代码可以做到:

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

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

如果您只是想为要添加到批处理中的文档生成唯一的ID,请使用不带参数的document()代替:
DocumentReference ref = myCollection.document();

关于dart - Firestore batch.commit一次添加500多个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61917444/

相关文章:

asynchronous - Dart 中的 Stream 和 Future

android - 删除某些项目后,RecyclerView 中的 Firestore Firebase 分页无法正常工作

firebase - Flutter 文档快照

firebase - 如何在数组 flutter Firestore 中添加映射

flutter - 带淡出然后淡入的动画交叉淡入淡出

flutter - SingleChildScrollView不保持滚动位置

dictionary - 是否有更好的方式在Dart中编写此数据结构?

dart - 如何比较同一类型的两个对象的值?

javascript - Firestore/Javascript : How to get document data using timestamps?

firebase - 无法确定 Firestore REST API 调用的正确顺序以使用事务更新文档