以下示例演示了如何删除文档、字段和集合。
删除文档
如需删除文档,请使用 delete()
方法:
Web
db.collection("cities").doc("DC").delete().then(function() { console.log("Document successfully deleted!"); }).catch(function(error) { console.error("Error removing document: ", error); });
Swift
db.collection("cities").document("DC").delete() { err in if let err = err { print("Error removing document: \(err)") } else { print("Document successfully removed!") } }
Objective-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"] deleteDocumentWithCompletion:^(NSError * _Nullable error) { if (error != nil) { NSLog(@"Error removing document: %@", error); } else { NSLog(@"Document successfully removed!"); } }];
Java
Android
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); } });
Kotlin+KTX
Android
db.collection("cities").document("DC") .delete() .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully deleted!") } .addOnFailureListener { e -> Log.w(TAG, "Error deleting document", e) }
Java
// asynchronously delete a document ApiFuture<WriteResult> writeResult = db.collection("cities").document("DC").delete(); // ... System.out.println("Update time : " + writeResult.get().getUpdateTime());
Python
db.collection(u'cities').document(u'DC').delete()
C++
db->Collection("cities").Document("DC").Delete().OnCompletion( [](const Future<void>& future) { if (future.error() == Error::kErrorOk) { std::cout << "DocumentSnapshot successfully deleted!\n"; } else { std::cout << "Error deleting document: " << future.error_message() << '\n'; } });
Node.js
const res = await db.collection('cities').doc('DC').delete();
Go
_, err := client.Collection("cities").Doc("DC").Delete(ctx) if err != nil { // Handle any errors in an appropriate way, such as returning them. log.Printf("An error has occurred: %s", err) }
PHP
$db->collection('cities')->document('DC')->delete();
Unity
DocumentReference cityRef = db.Collection("cities").Document("DC"); cityRef.DeleteAsync();
C#
DocumentReference cityRef = db.Collection("cities").Document("DC"); await cityRef.DeleteAsync();
Ruby
city_ref = firestore.doc "#{collection_path}/DC" city_ref.delete
删除文档时,Firestore 不会自动删除其子集合中的文档。您仍然可以通过引用访问子集合文档。例如,即使您删除位于 /mycoll/mydoc
的祖先文档,也可以访问路径为 /mycoll/mydoc/mysubcoll/mysubdoc
的文档。
不存在的祖先文档会显示在控制台中,但不会显示在查询结果和快照中。
如果要删除某个文档及其子集合中的所有文档,您必须手动操作。如需了解详情,请参阅删除集合。
删除字段
如需从文档中删除特定字段,请在更新文档时使用 FieldValue.delete()
方法:
Web
var cityRef = db.collection('cities').doc('BJ'); // Remove the 'capital' field from the document var removeCapital = cityRef.update({ capital: firebase.firestore.FieldValue.delete() });
Swift
db.collection("cities").document("BJ").updateData([ "capital": FieldValue.delete(), ]) { err in if let err = err { print("Error updating document: \(err)") } else { print("Document successfully updated") } }
Objective-C
[[[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"); } }];
Java
Android
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>() { // ... // ...
Kotlin+KTX
Android
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
DocumentReference docRef = db.collection("cities").document("BJ"); Map<String, Object> updates = new HashMap<>(); updates.put("capital", FieldValue.delete()); // Update and delete the "capital" field in the document ApiFuture<WriteResult> writeResult = docRef.update(updates); System.out.println("Update time : " + writeResult.get());
Python
city_ref = db.collection(u'cities').document(u'BJ') city_ref.update({ u'capital': firestore.DELETE_FIELD })
C++
DocumentReference doc_ref = db->Collection("cities").Document("BJ"); doc_ref.Update({{"capital", FieldValue::Delete()}}) .OnCompletion([](const Future<void>& future) { /*...*/ });
Node.js
// Get the `FieldValue` object const FieldValue = admin.firestore.FieldValue; // Create a document reference const cityRef = db.collection('cities').doc('BJ'); // Remove the 'capital' field from the document const res = await cityRef.update({ capital: FieldValue.delete() });
Go
_, err := client.Collection("cities").Doc("BJ").Update(ctx, []firestore.Update{ { Path: "capital", Value: firestore.Delete, }, }) if err != nil { // Handle any errors in an appropriate way, such as returning them. log.Printf("An error has occurred: %s", err) }
PHP
$cityRef = $db->collection('cities')->document('BJ'); $cityRef->update([ ['path' => 'capital', 'value' => FieldValue::deleteField()] ]);
Unity
DocumentReference cityRef = db.Collection("cities").Document("BJ"); Dictionary<string, object> updates = new Dictionary<string, object> { { "Capital", FieldValue.Delete } };
C#
DocumentReference cityRef = db.Collection("cities").Document("BJ"); Dictionary<string, object> updates = new Dictionary<string, object> { { "Capital", FieldValue.Delete } }; await cityRef.UpdateAsync(updates);
Ruby
city_ref = firestore.doc "#{collection_path}/BJ" city_ref.update capital: firestore.field_delete
删除集合
如需删除 Firestore 中的整个集合或子集合,请检索该集合或子集合中的所有文档并将其删除。如果您的集合较大,可能需要分批删除文档,以免发生内存不足的错误。重复这一过程,直到删除整个集合或子集合。
为删除集合,您需要协调不定数量的单独的删除请求。如果您需要删除整个集合,请仅从可信的服务器环境中执行此操作。虽然可以从移动/Web 客户端删除集合,但这样做会对安全和性能产生负面影响。
下面的代码段已经过简化,不涉及错误处理、安全、删除子集合或性能最大化。如需详细了解在生产环境中删除集合的一种推荐方法,请参阅删除集合与子集合。
网页
// Deleting collections from a Web client is not recommended.
Swift
// Deleting collections from an iOS client is not recommended.
Objective-C
// Deleting collections from an iOS client is not recommended.
Java
Android
// Deleting collections from an Android client is not recommended.
Kotlin+KTX
Android
// Deleting collections from an Android client is not recommended.
Java
/** Delete a collection in batches to avoid out-of-memory errors. * Batch size may be tuned based on document size (atmost 1MB) and application requirements. */ void deleteCollection(CollectionReference collection, int batchSize) { try { // retrieve a small batch of documents to avoid out-of-memory errors ApiFuture<QuerySnapshot> future = collection.limit(batchSize).get(); int deleted = 0; // future.get() blocks on document retrieval List<QueryDocumentSnapshot> documents = future.get().getDocuments(); for (QueryDocumentSnapshot document : documents) { document.getReference().delete(); ++deleted; } if (deleted >= batchSize) { // retrieve and delete another batch deleteCollection(collection, batchSize); } } catch (Exception e) { System.err.println("Error deleting collection : " + e.getMessage()); } }
Python
def delete_collection(coll_ref, batch_size): docs = coll_ref.limit(batch_size).stream() deleted = 0 for doc in docs: print(f'Deleting doc {doc.id} => {doc.to_dict()}') doc.reference.delete() deleted = deleted + 1 if deleted >= batch_size: return delete_collection(coll_ref, batch_size)
C++
// This is not supported. Delete data using CLI as discussed below.
Node.js
async function deleteCollection(db, collectionPath, batchSize) { const collectionRef = db.collection(collectionPath); const query = collectionRef.orderBy('__name__').limit(batchSize); return new Promise((resolve, reject) => { deleteQueryBatch(db, query, resolve).catch(reject); }); } async function deleteQueryBatch(db, query, resolve) { const snapshot = await query.get(); const batchSize = snapshot.size; if (batchSize === 0) { // When there are no documents left, we are done resolve(); return; } // Delete documents in a batch const batch = db.batch(); snapshot.docs.forEach((doc) => { batch.delete(doc.ref); }); await batch.commit(); // Recurse on the next process tick, to avoid // exploding the stack. process.nextTick(() => { deleteQueryBatch(db, query, resolve); }); }
Go
func deleteCollection(ctx context.Context, client *firestore.Client, ref *firestore.CollectionRef, batchSize int) error { for { // Get a batch of documents iter := ref.Limit(batchSize).Documents(ctx) numDeleted := 0 // Iterate through the documents, adding // a delete operation for each one to a // WriteBatch. batch := client.Batch() for { doc, err := iter.Next() if err == iterator.Done { break } if err != nil { return err } batch.Delete(doc.Ref) numDeleted++ } // If there are no documents to delete, // the process is over. if numDeleted == 0 { return nil } _, err := batch.Commit(ctx) if err != nil { return err } } }
PHP
function delete_collection($collectionReference, $batchSize) { $documents = $collectionReference->limit($batchSize)->documents(); while (!$documents->isEmpty()) { foreach ($documents as $document) { printf('Deleting document %s' . PHP_EOL, $document->id()); $document->reference()->delete(); } $documents = $collectionReference->limit($batchSize)->documents(); } }
Unity
// This is not supported. Delete data using CLI as discussed below.
C#
private static async Task DeleteCollection(CollectionReference collectionReference, int batchSize) { QuerySnapshot snapshot = await collectionReference.Limit(batchSize).GetSnapshotAsync(); IReadOnlyList<DocumentSnapshot> documents = snapshot.Documents; while (documents.Count > 0) { foreach (DocumentSnapshot document in documents) { Console.WriteLine("Deleting document {0}", document.Id); await document.Reference.DeleteAsync(); } snapshot = await collectionReference.Limit(batchSize).GetSnapshotAsync(); documents = snapshot.Documents; } Console.WriteLine("Finished deleting all documents from the collection."); }
Ruby
cities_ref = firestore.col collection_path query = cities_ref query.get do |document_snapshot| puts "Deleting document #{document_snapshot.document_id}." document_ref = document_snapshot.ref document_ref.delete end
使用 Firebase CLI 删除数据
您还可以使用 Firebase CLI 删除文档和集合。如需删除数据,请使用以下命令:
firebase firestore:delete [options] <<path>>
使用 Console 删除数据
您可以从控制台的 Firestore 页面删除文档和集合。从控制台删除文档将删除该文档中的所有嵌套数据,包括所有子集合。