首页 > 解决方案 > Firestore 文档没有被删除

问题描述

我试图在将新数据保存在同一文档快照 ID 上之前删除文档,但delete()功能似乎没有效果。我可以将新数据添加到同一文档的孩子collection。当前用户(唯一用户)具有写权限。完整的写入规则如下所示 -

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read: if request.auth!=null;
      allow write: if request.auth.uid == "removed-for-security-reason";
    }
  }
}

删除文档的代码 -

fun saveUserLanguage(languages: ArrayList<NELanguage>, success : () -> Unit, error: () -> Unit){
    val db = FirebaseFirestore.getInstance()
    val userRef = db.collection("user_language").document(user!!.uid)
    
    userRef.delete()
    .addOnSuccessListener {
       // the following works
       val userLanguageRef = userRef.collection("data")
        db.runBatch {batch ->
          languages.forEach {
            batch.set(userLanguageRef.document(it.id), it)
          }
       }.addOnSuccessListener {
         success()
       }.addOnFailureListener {
         error()
       }
   }
}

标签: firebasegoogle-cloud-firestore

解决方案


采用 Firestore 数据库的结构(从我在问题中可以看到的):

user_language       // Root collection
  doc1              // Document
    data            // Data subcollection
      somedoc       // Subcollection documents
      anotherdoc    

当根集合 ( doc1 ) 中的文档具有子集合并且您对其调用 delete 方法时,会发生以下情况:

  • 该文档不会出现在查询或快照中。即:db.collection('user_language').get()结果将不包括doc1
  • 该文档仍将在 Firestore 控制台 UI 中可见
  • 子集合数据及其文档不会被删除。

因此,虽然文档确实被删除了,但如果您检查控制台 UI,它可能不会像这样显示。尽管如此,您会看到该文档没有任何字段。此行为记录在 Firestore文档的“删除数据”下。

如果您想要实现的是删除文档以及子集合,我建议您查看以下页面,该页面提供了一些代码示例和这方面的最佳实践。


推荐阅读