我是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();
}
答案 0 :(得分:1)
您的代码实际上只是单独添加每个文档,而不管您对该批处理如何进行。这行代码可以做到:
DocumentReference ref = await myCollection.add(obj.toMap());
如果您删除该行(再次没有碰到batch
),我相信由于批次大小,您只会看到失败。
如果您只是想为要添加到批处理中的文档生成唯一的ID,请使用不带参数的document():
DocumentReference ref = myCollection.document();