firebase - 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()
}
}
}
解决方案
采用 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文档的“删除数据”下。
如果您想要实现的是删除文档以及子集合,我建议您查看以下页面,该页面提供了一些代码示例和这方面的最佳实践。
推荐阅读
- r - R中的复杂for循环?
- typescript - 我应该如何初始化稍后分配的字符串变量?
- mysql - 如何从同一张表中查询同一列但条件不同的两个不同的 Sum?
- sql - 子查询在插入数据时必须只返回一列才能返回
- r - 如何在R中按多个条件分组和求和
- r - Circos 热图如何按标签拆分?
- user-interface - 向下滑动页面时有没有办法为对象设置动画/
- javascript - 我使用 fetch 语句来检索我的 HTML 页脚并将其包含在每个页面上,但页脚中的 Date().getFullYear 脚本永远不会被执行
- android - 如何从 VS 2019 或 android 上的设备中找到领域文件
- android - Unity Touch.Phase.Position 总是返回 (0,0,0)