Issue
我正在寻找一个临时解决方案来从客户端删除集合以进行概念证明。我最终将按照建议将其重构到服务器上。
我添加了删除所有特定 Firestore 用户帐户信息的功能,包括他们在应用程序中保存的内容集合。根据Firestore 文档 https://firebase.google.com/docs/firestore/manage-data/delete-data#collections客户端没有规定的方法来执行此操作,因为建议在服务器上处理此操作。
要从 Cloud Firestore 数据库中删除整个集合或子集合,您需要检索该集合或子集合中的所有文档并将其删除。
如果您有较大的集合,您可能需要小批量删除文档以避免内存不足错误。因此,您应该重复此过程,直到删除整个集合或子集合。
即使 Firebase 团队不推荐删除操作(因为它会对安全性和性能产生负面影响),您仍然可以执行此操作,但仅限于以下情况:small collections
。如果您需要删除整个 Web 集合,请仅从受信任的服务器环境中执行此操作。
对于 Kotlin,请使用以下函数:
private fun deleteCollection(collection: CollectionReference, executor: Executor) {
Tasks.call(executor) {
val batchSize = 10
var query = collection.orderBy(FieldPath.documentId()).limit(batchSize.toLong())
var deleted = deleteQueryBatch(query)
while (deleted.size >= batchSize) {
val last = deleted[deleted.size - 1]
query = collection.orderBy(FieldPath.documentId()).startAfter(last.id).limit(batchSize.toLong())
deleted = deleteQueryBatch(query)
}
null
}
}
@WorkerThread
@Throws(Exception::class)
private fun deleteQueryBatch(query: Query): List<DocumentSnapshot> {
val querySnapshot = Tasks.await(query.get())
val batch = query.firestore.batch()
for (snapshot in querySnapshot) {
batch.delete(snapshot.reference)
}
Tasks.await(batch.commit())
return querySnapshot.documents
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)