Daten aus Cloud Firestore löschen

Die folgenden Beispiele veranschaulichen, wie Sie Dokumente, Felder und Sammlungen löschen.

Dokumente löschen

Verwenden Sie die folgenden sprachspezifischen delete()-Methoden, um ein Dokument zu löschen:

Web

Verwenden Sie die Methode deleteDoc():

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

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

Web

Verwenden Sie die Methode delete():

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

Verwenden Sie die Methode delete():

Hinweis: Dieses Produkt nicht ist auf WatchOS- und App Clip-Zielen verfügbar.
do {
  try await db.collection("cities").document("DC").delete()
  print("Document successfully removed!")
} catch {
  print("Error removing document: \(error)")
}
Objective-C

Verwenden Sie die Methode deleteDocumentWithCompletion::

Hinweis: Dieses Produkt nicht ist auf WatchOS- und App Clip-Zielen verfügbar.
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"]
    deleteDocumentWithCompletion:^(NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error removing document: %@", error);
      } else {
        NSLog(@"Document successfully removed!");
      }
}];

Kotlin

Verwenden Sie die Methode delete():

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

Java

Verwenden Sie die Methode 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

Verwenden Sie die Methode delete():

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

Verwenden Sie die Methode delete():

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

Verwenden Sie die Methode delete():

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

Python

Verwenden Sie die Methode delete():

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

Verwenden Sie die Methode 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

Verwenden Sie die Methode delete():

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

Verwenden Sie die Methode 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

Verwenden Sie die Methode delete():

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

Verwenden Sie die Methode DeleteAsync():

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

Verwenden Sie die Methode DeleteAsync():

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

Verwenden Sie die Methode delete():

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

Wenn Sie ein Dokument löschen, Cloud Firestore werden die Dokumente in den zugehörigen Unterordnern nicht automatisch gelöscht. Sie können über einen Verweis weiterhin auf die untergeordnete Sammlung zugreifen. Sie können beispielsweise auf das Dokument unter dem Pfad /mycoll/mydoc/mysubcoll/mysubdoc zugreifen, auch wenn Sie das übergeordnete Dokument unter /mycoll/mydoc löschen.

Nicht vorhandene übergeordnete Dokumente werden in der Konsole angezeigt, aber nicht in Abfrageergebnissen und Übersichten.

Wenn Sie ein Dokument und alle in dessen untergeordneten Sammlungen enthaltenen Dokumente löschen möchten, müssen Sie dies manuell tun. Weitere Informationen finden Sie unter Sammlungen löschen.

Felder löschen

Wenn Sie bestimmte Felder aus einem Dokument löschen möchten, verwenden Sie beim Aktualisieren eines Dokuments die folgenden sprachspezifischen FieldValue.delete()-Methoden:

Web

Verwenden Sie die Methode 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

Verwenden Sie die Methode 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

Verwenden Sie die Methode FieldValue.delete():

Hinweis: Dieses Produkt nicht ist auf WatchOS- und App Clip-Zielen verfügbar.
do {

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

Verwenden Sie die Methode fieldValueForDelete::

Hinweis: Dieses Produkt nicht ist auf WatchOS- und App Clip-Zielen verfügbar.
[[[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

Verwenden Sie die Methode 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

Verwenden Sie die Methode 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

Verwenden Sie die Methode 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

Verwenden Sie die Methode 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

Verwenden Sie die Methode firestore.DELETE_FIELD:

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

Python

Verwenden Sie die Methode firestore.DELETE_FIELD:

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

Verwenden Sie die Methode FieldValue::Delete():

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

Verwenden Sie die Methode 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

Verwenden Sie die Methode 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

Verwenden Sie die Methode FieldValue::deleteField():

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

Verwenden Sie die Methode FieldValue.Delete:

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

Verwenden Sie die Methode 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

Verwenden Sie die Methode firestore.field_delete:

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

Sammlungen löschen

Wenn Sie eine ganze Sammlung oder Untersammlung in Cloud Firestore löschen möchten, rufen Sie alle Dokumente in der Sammlung oder Untersammlung ab (lesen Sie sie) und löschen Sie sie. Für diesen Vorgang fallen sowohl Lese- als auch Löschkosten an. Wenn Sie größere Sammlungen haben, sollten Sie die Dokumente in kleineren Batches löschen, um Fehler aufgrund von Speichermangel zu vermeiden. Wiederholen Sie den Vorgang, bis Sie die gesamte Sammlung oder Unterteilung gelöscht haben.

Zum Löschen einer Sammlung muss eine unbegrenzte Anzahl einzelner Löschanfragen koordiniert werden. Wenn Sie ganze Sammlungen löschen möchten, tun Sie dies nur von einer vertrauenswürdigen Serverumgebung aus. Es ist zwar möglich, eine Sammlung von einem Mobil-/Web-Client aus zu löschen, dies hat jedoch negative Auswirkungen auf Sicherheit und Leistung.

Die folgenden Snippets wurden zur besseren Übersichtlichkeit vereinfacht und enthalten keine Fehlerbehandlung, Sicherheitsmaßnahmen, das Löschen von Unterkollektionen oder Leistungsoptimierungen. Weitere Informationen zu einem empfohlenen Ansatz zum Löschen von Sammlungen in der Produktion finden Sie unter Sammlungen und untergeordnete Sammlungen löschen.

Web
// Deleting collections from a Web client is not recommended.
Swift
Hinweis: Dieses Produkt nicht ist auf WatchOS- und App Clip-Zielen verfügbar.
// Deleting collections from an Apple client is not recommended.
Objective-C
Hinweis: Dieses Produkt nicht ist auf WatchOS- und App Clip-Zielen verfügbar.
// 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

Das Löschen von Sammlungen auf dem Client wird nicht empfohlen.

Java

import com.google.api.core.ApiFuture;
import com.google.cloud.firestore.CollectionReference;
import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.FirestoreOptions;

public class DeleteCollection {

  /**
   * Delete a collection and all its subcollections.
   *
   * @param projectId The Google Cloud project ID
   * @param collectionName The name of the collection to delete
   */
  public static void deleteCollection(String projectId, String collectionName) throws Exception {
    FirestoreOptions firestoreOptions =
        FirestoreOptions.getDefaultInstance().toBuilder().setProjectId(projectId).build();
    try (Firestore db = firestoreOptions.getService()) {
      CollectionReference collection = db.collection(collectionName);

      ApiFuture<Void> future = db.recursiveDelete(collection);

      future.get();
      System.out.println("Collection and all its subcollections deleted successfully.");
    }
  }

  public static void main(String[] args) throws Exception {
    String projectId = "example-project-id";
    String collectionName = "example-collection-name";

    deleteCollection(projectId, collectionName);
  }
}
Python
def delete_collection(coll_ref):

    print(f"Recursively deleting collection: {coll_ref}")
    db.recursive_delete(coll_ref)

Python

async def delete_collection(coll_ref):

    await db.recursive_delete(coll_ref)
C++
// This is not supported. Delete data using CLI as discussed below.
  
Node.js
async function deleteCollection(db, collectionPath) {
  const collectionRef = db.collection(collectionPath);
  return await db.recursiveDelete(collectionRef);
}
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

Daten mit TTL-Richtlinien löschen

In einer TTL-Richtlinie wird ein bestimmtes Feld als Ablaufzeit für Dokumente in einer bestimmten Sammlungsgruppe festgelegt. TTL-Löschvorgänge werden auf Ihre Kosten für das Löschen von Dokumenten angerechnet.

Informationen zum Festlegen von TTL finden Sie unter Datenaufbewahrung mit TTL-Richtlinien verwalten.

Bulk-Löschjobs

Cloud Firestore unterstützt mehrere Tools für das Massenlöschen. Sie sollten ein Tool basierend auf der Anzahl der Dokumente, die Sie löschen müssen, und dem erforderlichen Konfigurationsgrad auswählen.

Bei kleineren Jobs mit Tausenden von Dokumenten können Sie die Console oder die Firebase CLI verwenden. Bei größeren Aufgaben kann es bei diesen Tools zu Zeitüberschreitungen kommen, sodass Sie das Tool mehrmals ausführen müssen.

Console

Sie können Dokumente und Sammlungen auf der Seite Cloud Firestore in der Console löschen. Wenn Sie ein Dokument über die Konsole löschen, werden alle verschachtelten Daten in diesem Dokument gelöscht, einschließlich aller untergeordneten Sammlungen.

Firebase CLI

Sie können auch die Firebase CLI verwenden, um Dokumente und Sammlungen zu löschen. Verwenden Sie den folgenden Befehl, um Daten zu löschen:

firebase firestore:delete  --database=DATABASE_ID PATH

Ersetzen Sie DATABASE_ID durch Ihre Datenbank-ID und PATH durch einen Pfad zu einem Dokument oder einer Sammlung.

Verwenden Sie für große Löschjobs (Millionen von Dokumenten) eine der folgenden Optionen:

Verwaltetes Bulk-Löschen

In Cloud Firestore können Sie eine oder mehrere Sammlungsgruppen gleichzeitig löschen. Weitere Informationen finden Sie unter Daten im Bulk löschen.

Dataflow-Connector

Sie können Dataflow für Bulk-Vorgänge in Ihrer Datenbank verwenden. Diese Option bietet die meisten Konfigurationsmöglichkeiten, erfordert aber auch mehr Einrichtung als andere Optionen zum Massenlöschen. Im Cloud Firestore-Connector-Blogbeitrag zur Einführung von Dataflow finden Sie ein Beispiel für das Löschen aller Dokumente in einer Sammlungsgruppe.