【问题标题】:Firestore batch.commit adding more than 500 documents at a timeFirestore batch.commit 一次添加 500 多个文档
【发布时间】:2020-05-20 15:54:07
【问题描述】:

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

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

我知道我应该一次将其分解为 500 个,但它添加了列表中的所有文档这一事实对我来说没有意义。我在 Firestore 控制台中检查了所有 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();
  }

【问题讨论】:

    标签: dart google-cloud-firestore


    【解决方案1】:

    您的代码实际上只是单独添加每个文档,而不管您对批处理执行什么操作。这行代码做到了:

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

    如果您删除该行(同样,它不会触及您的batch),我相信您只会看到由于批量大小而导致的失败。

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

    DocumentReference ref = myCollection.document();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多