Menghapus data dari Cloud Firestore

Contoh berikut menunjukkan cara menghapus dokumen, kolom, dan koleksi.

Menghapus dokumen

Untuk menghapus dokumen, gunakan metode delete() khusus bahasa berikut:

Web

Gunakan metode deleteDoc():

import { doc, deleteDoc } from "firebase/firestore";

await deleteDoc(doc(db, "cities", "DC"));

Web

Gunakan metode delete():

db.collection("cities").doc("DC").delete().then(() => {
    console.log("Document successfully deleted!");
}).catch((error) => {
    console.error("Error removing document: ", error);
});
Swift

Gunakan metode delete():

Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
do {
  try await db.collection("cities").document("DC").delete()
  print("Document successfully removed!")
} catch {
  print("Error removing document: \(error)")
}
Objective-C

Gunakan metode deleteDocumentWithCompletion::

Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"]
    deleteDocumentWithCompletion:^(NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error removing document: %@", error);
      } else {
        NSLog(@"Document successfully removed!");
      }
}];

Kotlin

Gunakan metode delete():

db.collection("cities").document("DC")
    .delete()
    .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully deleted!") }
    .addOnFailureListener { e -> Log.w(TAG, "Error deleting document", e) }

Java

Gunakan metode 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

Gunakan metode delete():

db.collection("cities").doc("DC").delete().then(
      (doc) => print("Document deleted"),
      onError: (e) => print("Error updating document $e"),
    );
Java

Gunakan metode delete():

// asynchronously delete a document
ApiFuture<WriteResult> writeResult = db.collection("cities").document("DC").delete();
// ...
System.out.println("Update time : " + writeResult.get().getUpdateTime());
Python

Gunakan metode delete():

db.collection("cities").document("DC").delete()

Python

Gunakan metode delete():

await db.collection("cities").document("DC").delete()
C++

Gunakan metode 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

Gunakan metode delete():

const res = await db.collection('cities').doc('DC').delete();
Go

Gunakan metode Delete():


import (
	"context"
	"log"

	"cloud.google.com/go/firestore"
)

func deleteDoc(ctx context.Context, client *firestore.Client) error {
	_, 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)
	}

	return err
}
PHP

Gunakan metode delete():

$db->collection('samples/php/cities')->document('DC')->delete();
Unity

Gunakan metode DeleteAsync():

DocumentReference cityRef = db.Collection("cities").Document("DC");
cityRef.DeleteAsync();
C#

Gunakan metode DeleteAsync():

DocumentReference cityRef = db.Collection("cities").Document("DC");
await cityRef.DeleteAsync();
Ruby

Gunakan metode delete():

city_ref = firestore.doc "#{collection_path}/DC"
city_ref.delete

Jika Anda menghapus dokumen, Cloud Firestore tidak otomatis menghapus dokumen dalam subkoleksinya. Anda masih dapat mengakses dokumen subkoleksi dengan referensi. Sebagai contoh, Anda dapat mengakses dokumen di jalur /mycoll/mydoc/mysubcoll/mysubdoc meskipun Anda menghapus dokumen ancestor di /mycoll/mydoc.

Dokumen ancestor yang tidak ada akan muncul di konsol, tetapi tidak akan muncul dalam hasil kueri dan snapshot.

Jika ingin menghapus satu dokumen dan semua dokumen dalam subkoleksinya, Anda harus melakukannya secara manual. Untuk informasi lebih lanjut, lihat Menghapus Koleksi.

Menghapus kolom

Untuk menghapus kolom tertentu dari dokumen, gunakan metode FieldValue.delete() khusus bahasa berikut saat memperbarui dokumen:

Web

Gunakan metode 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

Gunakan metode 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

Gunakan metode FieldValue.delete():

Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
do {

  try await db.collection("cities").document("BJ").updateData([
    "capital": FieldValue.delete(),
  ])
  print("Document successfully updated")
} catch {
  print("Error updating document: \(error)")
}
Objective-C

Gunakan metode fieldValueForDelete::

Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
[[[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

Gunakan metode 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

Gunakan metode 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

Gunakan metode 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

Gunakan metode FieldValue.delete():

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

Gunakan metode firestore.DELETE_FIELD:

city_ref = db.collection("cities").document("BJ")
city_ref.update({"capital": firestore.DELETE_FIELD})

Python

Gunakan metode firestore.DELETE_FIELD:

city_ref = db.collection("cities").document("BJ")
await city_ref.update({"capital": firestore.DELETE_FIELD})
C++

Gunakan metode FieldValue::Delete():

DocumentReference doc_ref = db->Collection("cities").Document("BJ");
doc_ref.Update({{"capital", FieldValue::Delete()}})
    .OnCompletion([](const Future<void>& future) { /*...*/ });
Node.js

Gunakan metode FieldValue.delete():

// 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

Gunakan metode firestore.Delete:


import (
	"context"
	"log"

	"cloud.google.com/go/firestore"
)

func deleteField(ctx context.Context, client *firestore.Client) error {
	_, 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)
	}

	// ...
	return err
}
PHP

Gunakan metode FieldValue::deleteField():

$cityRef = $db->collection('samples/php/cities')->document('BJ');
$cityRef->update([
    ['path' => 'capital', 'value' => FieldValue::deleteField()]
]);
Unity

Gunakan metode FieldValue.Delete:

DocumentReference cityRef = db.Collection("cities").Document("BJ");
Dictionary<string, object> updates = new Dictionary<string, object>
{
    { "Capital", FieldValue.Delete }
};
C#

Gunakan metode FieldValue.Delete:

DocumentReference cityRef = db.Collection("cities").Document("BJ");
Dictionary<string, object> updates = new Dictionary<string, object>
{
    { "Capital", FieldValue.Delete }
};
await cityRef.UpdateAsync(updates);
Ruby

Gunakan metode firestore.field_delete:

city_ref = firestore.doc "#{collection_path}/BJ"
city_ref.update({ capital: firestore.field_delete })

Menghapus koleksi

Untuk menghapus seluruh koleksi atau subkoleksi di Cloud Firestore, ambil (baca) semua dokumen dalam koleksi atau subkoleksi itu, lalu lakukan penghapusan. Proses ini dikenai biaya operasi baca dan hapus. Jika koleksi berukuran besar , sebaiknya Anda menghapus dokumen dalam beberapa batch kecil untuk menghindari error akibat kehabisan memori. Ulangi prosesnya sampai Anda berhasil menghapus seluruh koleksi atau subkoleksi.

Untuk menghapus koleksi, diperlukan koordinasi permintaan penghapusan individu dengan jumlah tidak terbatas. Jika Anda perlu menghapus seluruh koleksi, hanya lakukan penghapusan dari lingkungan server yang tepercaya. Meskipun penghapusan koleksi dapat dilakukan dari klien seluler/web, tindakan itu berdampak negatif pada keamanan dan performa.

Cuplikan di bawah ini telah disederhanakan dan tidak mencakup penanganan error, keamanan, penghapusan subkoleksi, atau pemaksimalan performa. Untuk mempelajari lebih lanjut satu pendekatan yang disarankan untuk menghapus koleksi dalam produksi, lihat Menghapus Koleksi dan Subkoleksi.

Web
// Deleting collections from a Web client is not recommended.
Swift
Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
// Deleting collections from an Apple client is not recommended.
Objective-C
Catatan: Produk ini tidak tersedia di target watchOS dan App Clip.
// Deleting collections from an Apple client is not recommended.
  

Kotlin

// Deleting collections from an Android client is not recommended.

Java

// Deleting collections from an Android client is not recommended.

Dart

Menghapus koleksi dari klien tidak direkomendasikan.

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):
    if batch_size == 0:
        return

    docs = coll_ref.list_documents(page_size=batch_size)
    deleted = 0

    for doc in docs:
        print(f"Deleting doc {doc.id} => {doc.get().to_dict()}")
        doc.delete()
        deleted = deleted + 1

    if deleted >= batch_size:
        return delete_collection(coll_ref, batch_size)

Python

async def delete_collection(coll_ref, batch_size):
    docs = coll_ref.limit(batch_size).stream()
    deleted = 0

    async for doc in docs:
        print(f"Deleting doc {doc.id} => {doc.to_dict()}")
        await 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

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/firestore"
	"google.golang.org/api/iterator"
)

func deleteCollection(w io.Writer, projectID, collectionName string,
	batchSize int) error {

	// Instantiate a client
	ctx := context.Background()
	client, err := firestore.NewClient(ctx, projectID)
	if err != nil {
		return err
	}

	col := client.Collection(collectionName)
	bulkwriter := client.BulkWriter(ctx)

	for {
		// Get a batch of documents
		iter := col.Limit(batchSize).Documents(ctx)
		numDeleted := 0

		// Iterate through the documents, adding
		// a delete operation for each one to the BulkWriter.
		for {
			doc, err := iter.Next()
			if err == iterator.Done {
				break
			}
			if err != nil {
				return err
			}

			bulkwriter.Delete(doc.Ref)
			numDeleted++
		}

		// If there are no documents to delete,
		// the process is over.
		if numDeleted == 0 {
			bulkwriter.End()
			break
		}

		bulkwriter.Flush()
	}
	fmt.Fprintf(w, "Deleted collection \"%s\"", collectionName)
	return nil
}
PHP
function data_delete_collection(string $projectId, string $collectionName, int $batchSize)
{
    // Create the Cloud Firestore client
    $db = new FirestoreClient([
        'projectId' => $projectId,
    ]);
    $collectionReference = $db->collection($collectionName);
    $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

Menghapus data dengan Firebase CLI

Anda juga bisa menggunakan Firebase CLI untuk menghapus dokumen dan koleksi. Gunakan perintah berikut untuk menghapus data:

firebase firestore:delete [options] <<path>>

Menghapus data dengan konsol

Anda dapat menghapus dokumen dan koleksi dari halaman Cloud Firestore di konsol. Menghapus dokumen dari konsol akan menghapus semua data bertingkat dalam dokumen tersebut, termasuk subkoleksi yang ada.

Menghapus data dengan kebijakan TTL

Kebijakan TTL menetapkan kolom tertentu sebagai waktu habis masa berlaku untuk dokumen dalam grup koleksi tertentu. Operasi penghapusan TTL diperhitungkan dalam biaya penghapusan dokumen Anda.

Untuk mengetahui informasi cara menyetel TTL, lihat Mengelola retensi data dengan kebijakan TTL.

Untuk mengetahui informasi kode error lebih lanjut, dan cara menyelesaikan masalah latensi saat menghapus data, lihat halaman pemecahan masalah.

Menghapus data dengan Dataflow

Dataflow adalah alat yang canggih untuk operasi massal di database Firestore Anda. Contoh untuk menghapus semua dokumen dalam grup koleksi dapat dilihat di postingan blog pengantar konektor Firestore untuk Dataflow.

Menggunakan penghapusan massal terkelola

Cloud Firestore mendukung penghapusan massal pada satu atau beberapa grup koleksi. Untuk informasi selengkapnya, lihat Menghapus data secara massal.