循环将文档添加到 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() 之后没有任何事情发生,所以不需要使用带有awaitasync 函数。并且还因为使用同步调用将项目写入数据库的顺序并不重要。唯一的问题是打印语句中的信息是错误的,因为此时该项目尚未完成对数据库的写入。我们也不知道操作是否成功。 确实如此。愿意分享更多上下文或代码,以便我研究它吗? 我不确定您到底想知道什么,但请参阅下面的答案以获取原始问题的更多信息。我希望这会有所帮助。【参考方案2】:

事实上,所有项目都写入文档,但您不断覆盖文档,下一个项目仅以最后一个项目结束。

调用set() 时,您应该使用SetOptionsmerge 设置为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

颤振 |如何将数据添加到 Firestore 中的现有文档

如何从 FireStore 查询文档名称?

如何将具有自定义 ID 的文档添加到 Firestore

无法访问 Firestore 快照中的数据以将标记添加到存储在 Firebase 中的 Google 地图

Cloud Firestore:将字段值添加到文档