一次删除大量文档(例如1000多个文档)时,Firestore删除会挂起

时间:2020-08-19 06:13:47

标签: swift firebase google-cloud-firestore

我正试图允许用户批量删除一堆文档。如果文件数量不多,但工作量很大(例如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")
  }
}

有没有理由在大规模删除一堆文件后挂起,但在较小的文件集上可以正常工作?

1 个答案:

答案 0 :(得分:0)

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

前一段时间,根据Firebase的支持,“ database:remove”命令会通过将数据库节点分成多个块来删除数据库节点,从而防止数据库实例被锁定。

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