循环将文档添加到 Google Firestore
Posted
技术标签:
【中文标题】循环将文档添加到 Google Firestore【英文标题】:Loop to add docs to Google Firestore 【发布时间】:2021-12-27 15:17:53 【问题描述】:我正在尝试遍历 List
以将每个项目添加到 google firestore doc
。但是,我面临的问题是只有List
中的最后一项被添加到文档中。
注意:print("=== $i POST SUCCESSFULLY ADDED ====")
行按预期打印增量 5 次
问题:如何让这个循环将所有项目添加到 firestore 文档?
void addPost()
DocumentReference documentReferencer = _firestore.collection('posts').doc();
var i = 0;
while (i < 5)
documentReferencer.set(postsData[i]);
print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES
i++;
【问题讨论】:
【参考方案1】:我不完全知道您的问题出在哪里,但您的代码似乎忽略了将数据 POST 到服务器是 asynchronous
操作这一事实。
换句话说,我希望您需要await
来实现。
另外,我会重构循环以提高可读性。
你的代码应该是这样的:
Future<void> addPost() async
DocumentReference documentReferencer = _firestore.collection('posts').doc();
for(final post in postsData)
await documentReferencer.set(post);
print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES
【讨论】:
因为在set()
之后没有任何事情发生,所以不需要使用带有await
的async
函数。并且还因为使用同步调用将项目写入数据库的顺序并不重要。唯一的问题是打印语句中的信息是错误的,因为此时该项目尚未完成对数据库的写入。我们也不知道操作是否成功。
确实如此。愿意分享更多上下文或代码,以便我研究它吗?
我不确定您到底想知道什么,但请参阅下面的答案以获取原始问题的更多信息。我希望这会有所帮助。【参考方案2】:
事实上,所有项目都写入文档,但您不断覆盖文档,下一个项目仅以最后一个项目结束。
调用set()
时,您应该使用SetOptions
将merge
设置为true
,就像这样。
void addPost()
DocumentReference documentReferencer = _firestore.collection('posts').doc();
var i = 0;
while (i < 5)
documentReferencer.set(postsData[i], SetOptions(merge: true));
print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES
i++;
也可以使用update()
。注意:如果文档尚不存在,这将失败。
void addPost()
DocumentReference documentReferencer = _firestore.collection('posts').doc();
var i = 0;
while (i < 5)
documentReferencer.update(postsData[i]);
print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES
i++;
我建议您在密切关注数据库的同时逐步调试代码。然后你可以看到你是如何继续覆盖文档的。
还要注意,如果数据库调用出错,您不会发现任何错误。因此,您无法判断该操作是否成功。在print()
时,您唯一知道的就是请求已发送到 Firebase。
进一步阅读:
Firebase 文档:Add data to Cloud Firestore Flutter Firebase 文档:Usage - Writing data 堆栈溢出:Difference between set with merge: true and update【讨论】:
以上是关于循环将文档添加到 Google Firestore的主要内容,如果未能解决你的问题,请参考以下文章
Firestore - 如何在将文档添加到集合后获取文档 ID