删除文档和字段
以下示例演示了如何删除文档、字段和集合。
删除文档
要删除文档,请使用以下特定于语言的 delete()
方法:
Web 版本 9
使用 deleteDoc()
方法:
import { doc, deleteDoc } from "firebase/firestore"; await deleteDoc(doc(db, "cities", "DC"));
Web 版本 8
使用 delete()
方法:
db.collection("cities").doc("DC").delete().then(() => { console.log("Document successfully deleted!"); }).catch((error) => { console.error("Error removing document: ", error); });
Swift
使用 delete()
方法:
do { try await db.collection("cities").document("DC").delete() print("Document successfully removed!") } catch { print("Error removing document: \(error)") }
Objective-C
使用 deleteDocumentWithCompletion:
方法:
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"] deleteDocumentWithCompletion:^(NSError * _Nullable error) { if (error != nil) { NSLog(@"Error removing document: %@", error); } else { NSLog(@"Document successfully removed!"); } }];
Kotlin+KTX
Android
使用 delete()
方法:
db.collection("cities").document("DC") .delete() .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully deleted!") } .addOnFailureListener { e -> Log.w(TAG, "Error deleting document", e) }
Java
Android
使用 delete()
方法:
db.collection("cities").document("DC") .delete() .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { Log.d(TAG, "DocumentSnapshot successfully deleted!"); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error deleting document", e); } });
Dart
使用 delete()
方法:
db.collection("cities").doc("DC").delete().then( (doc) => print("Document deleted"), onError: (e) => print("Error updating document $e"), );
Java
使用 delete()
方法:
Python
使用 delete()
方法:
Python
(异步)
使用 delete()
方法:
C++
使用 Delete()
方法:
db->Collection("cities").Document("DC").Delete().OnCompletion( [](const Future<void>& future) { if (future.error() == Error::kErrorOk) { std::cout << "DocumentSnapshot successfully deleted!" << std::endl; } else { std::cout << "Error deleting document: " << future.error_message() << std::endl; } });
Node.js
使用 delete()
方法:
Go
使用 Delete()
方法:
PHP
使用 delete()
方法:
Unity
使用 DeleteAsync()
方法:
DocumentReference cityRef = db.Collection("cities").Document("DC"); cityRef.DeleteAsync();
C#
使用 DeleteAsync()
方法:
Ruby
使用 delete()
方法:
删除文档时,Firestore 不会自动删除其子集合中的文档。您仍然可以通过引用访问子集合文档。例如,即使您删除位于 /mycoll/mydoc
的祖先文档,也可以访问路径为 /mycoll/mydoc/mysubcoll/mysubdoc
的文档。
不存在的祖先文档会显示在控制台中,但不会显示在查询结果和快照中。
如果要删除某个文档及其子集合中的所有文档,您必须手动操作。如需了解详情,请参阅删除集合。
删除字段
如需从文档中删除特定字段,请在更新文档时使用以下特定于语言的 FieldValue.delete()
方法:
Web 版本 9
使用 deleteField()
方法:
import { doc, updateDoc, deleteField } from "firebase/firestore"; const cityRef = doc(db, 'cities', 'BJ'); // Remove the 'capital' field from the document await updateDoc(cityRef, { capital: deleteField() });
Web 版本 8
使用 FieldValue.delete()
方法:
var cityRef = db.collection('cities').doc('BJ'); // Remove the 'capital' field from the document var removeCapital = cityRef.update({ capital: firebase.firestore.FieldValue.delete() });
Swift
使用 FieldValue.delete()
方法:
do { try await db.collection("cities").document("BJ").updateData([ "capital": FieldValue.delete(), ]) print("Document successfully updated") } catch { print("Error updating document: \(error)") }
Objective-C
使用 fieldValueForDelete:
方法:
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"BJ"] updateData:@{ @"capital": [FIRFieldValue fieldValueForDelete] } completion:^(NSError * _Nullable error) { if (error != nil) { NSLog(@"Error updating document: %@", error); } else { NSLog(@"Document successfully updated"); } }];
Kotlin+KTX
Android
使用 FieldValue.delete()
方法:
val docRef = db.collection("cities").document("BJ") // Remove the 'capital' field from the document val updates = hashMapOf<String, Any>( "capital" to FieldValue.delete(), ) docRef.update(updates).addOnCompleteListener { }
Java
Android
使用 FieldValue.delete()
方法:
DocumentReference docRef = db.collection("cities").document("BJ"); // Remove the 'capital' field from the document Map<String,Object> updates = new HashMap<>(); updates.put("capital", FieldValue.delete()); docRef.update(updates).addOnCompleteListener(new OnCompleteListener<Void>() { // ... // ...
Dart
使用 FieldValue.delete()
方法:
final docRef = db.collection("cities").doc("BJ"); // Remove the 'capital' field from the document final updates = <String, dynamic>{ "capital": FieldValue.delete(), }; docRef.update(updates);
Java
使用 FieldValue.delete()
方法:
Python
使用 firestore.DELETE_FIELD
方法:
Python
(异步)
使用 firestore.DELETE_FIELD
方法:
C++
使用 FieldValue::Delete()
方法:
DocumentReference doc_ref = db->Collection("cities").Document("BJ"); doc_ref.Update({{"capital", FieldValue::Delete()}}) .OnCompletion([](const Future<void>& future) { /*...*/ });
Node.js
使用 FieldValue.delete()
方法:
Go
使用 firestore.Delete
方法:
PHP
使用 FieldValue::deleteField()
方法:
Unity
使用 FieldValue.Delete
方法:
DocumentReference cityRef = db.Collection("cities").Document("BJ"); Dictionary<string, object> updates = new Dictionary<string, object> { { "Capital", FieldValue.Delete } };
C#
使用 FieldValue.Delete
方法:
Ruby
请使用 firestore.field_delete
方法:
删除集合
如需删除 Firestore 中的整个集合或子集合,请检索(读取)该集合或子集合中的所有文档并将其删除。此过程会产生读取和删除费用。如果您的集合较大,您可能需要分批删除文档,以免发生内存不足的错误。重复这一过程,直到删除整个集合或子集合。
为删除集合,您需要协调不定数量的单独的删除请求。如果您需要删除整个集合,请仅从可信的服务器环境中执行此操作。虽然可以从移动/Web 客户端删除集合,但这样做会对安全和性能产生负面影响。
下面的代码段已经过简化,不涉及错误处理、安全、删除子集合或性能最大化。如需详细了解在生产环境中删除集合的一种推荐方法,请参阅删除集合与子集合。
Web
// Deleting collections from a Web client is not recommended.
Swift
// Deleting collections from an Apple client is not recommended.
Objective-C
// Deleting collections from an Apple client is not recommended.
Kotlin+KTX
Android
// Deleting collections from an Android client is not recommended.
Java
Android
// Deleting collections from an Android client is not recommended.
Dart
不建议从客户端删除集合。
Java
Python
Python
(异步)
C++
// This is not supported. Delete data using CLI as discussed below.
Node.js
Go
PHP
Unity
// This is not supported. Delete data using CLI as discussed below.
C#
Ruby
使用 Firebase CLI 删除数据
您还可以使用 Firebase CLI 删除文档和集合。如需删除数据,请使用以下命令:
firebase firestore:delete [options] <<path>>
使用控制台删除数据
您可以从控制台的 Firestore 页面删除文档和集合。从控制台删除文档将删除该文档中的所有嵌套数据,包括所有子集合。
使用 TTL 政策删除数据
TTL 政策会将某个字段指定为相应集合组中文档的到期时间。TTL 删除操作会计入文档删除费用。
如需了解如何设置 TTL,请参阅使用 TTL 政策管理数据保留。
如需详细了解错误代码以及如何解决删除数据时出现的延迟问题,请参阅问题排查页面。
使用 Dataflow 删除数据
Dataflow 是一个非常适合用于对 Firestore 数据库执行批量操作的工具。Dataflow 的 Firestore 连接器简介博文举例说明了如何删除合集组中的所有文档。