【问题标题】:Firestore delete hangs when deleting a large number of documents (e.g. 1000+ documents) at once一次删除大量文档(例如 1000 多个文档)时,Firestore 删除挂起
【发布时间】:2020-08-19 06:13:47
【问题描述】:

我试图让用户批量删除一堆文档。当没有那么多文档但有大量文档(例如 1000 多个文档)时,它可以正常工作,它会删除所有文档然后挂起。如果我关闭然后重新打开应用程序,我会看到所有文档都已根据需要删除。

我的代码是:

let query = self.collection.whereField("about", isEqualTo: self.about!.uid!).whereField("dataSource", isEqualTo: "appleHealth")
                
query.getDocuments() { (querySnapshot, err) in
  if let err = err {
    print("Error getting documents: \(err)")
  } else {
     for document in querySnapshot!.documents {
       document.reference.delete()
     }
  }
}

我也尝试在后台队列中运行它,但遇到了同样的问题。它打印“这是在主队列上运行,在外部块中的前一个代码之后”,但应用程序只是在之后挂起:

DispatchQueue.global(qos: .background).async { 
  print("This is run on the background queue")

  let query = self.collection.whereField("about", isEqualTo: self.about!.uid!).whereField("dataSource", isEqualTo: "appleHealth")
                
  query.getDocuments() { (querySnapshot, err) in
    if let err = err {
      print("Error getting documents: \(err)")
    } else {
       for document in querySnapshot!.documents {
       document.reference.delete()
       }
    }
  }

  DispatchQueue.main.async {
    print("This is run on the main queue, after the previous code in outer block")
  }
}

这是否有理由在大量删除一堆文档后挂起,但在较小的集合上工作正常?

【问题讨论】:

  • 您好,您的代码在哪里运行。您可能会在 SO 上找到这个答案,很有用
  • 最好重新设计你的firebase数据库结构,这样你就可以删除整个节点,而不是循环中一个一个地删除引用。

标签: swift firebase google-cloud-firestore


【解决方案1】:

如果您要删除大型节点,您可以考虑使用 CLI 工具,特别是“database:remove”。请参阅此处的官方参考: https://firebase.google.com/docs/cli?hl=en#rtdb-commands

根据前段时间 Firebase 的支持,“database:remove”命令将删除数据库的节点,将它们分成块,从而防止数据库实例锁定。

查看相关问题: how can I kill a Firebase transaction?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多