Dokumente und Felder 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 version 9

Verwenden Sie die Methode deleteDoc():

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

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

Web version 8

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
Android

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
Android

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
(Async)

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();
Unity

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, löscht Firestore nicht automatisch auch die Dokumente, die in den untergeordneten Sammlungen enthaltenen sind. Sie können über einen Verweis weiterhin auf die untergeordnete Sammlung zugreifen. Sie können beispielsweise auf das Dokument unter /mycoll/mydoc/mysubcoll/mysubdoc zugreifen, auch wenn Sie das übergeordnete Dokument unter /mycoll/mydoc löschen.

Nicht vorhandene übergeordnete Dokumente werden in der Console 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

Verwenden Sie die folgenden sprachspezifischen FieldValue.delete()-Methoden, um bestimmte Felder aus einem Dokument zu löschen, wenn Sie ein Dokument aktualisieren:

Web version 9

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 version 8

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
Android

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
Android

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
(Async)

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()]
]);
Unity

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 gesamte Sammlung oder untergeordnete Sammlung in Firestore löschen möchten, rufen Sie alle Dokumente in der Sammlung oder untergeordneten Sammlung ab (lesen Sie sie) und löschen Sie sie. Für diesen Vorgang fallen sowohl Lese- als auch Löschkosten an. Bei größeren Sammlungen sollten Sie die Dokumente in kleineren Batches löschen, um Fehler aufgrund von zu wenig Arbeitsspeicher zu vermeiden. Wiederholen Sie den Vorgang, bis Sie die gesamte Sammlung oder untergeordnete Sammlung 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 Übersicht vereinfacht und enthalten keine Fehlerbehandlung, Sicherheit, Löschung von untergeordneten Sammlungen 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
Android
// Deleting collections from an Android client is not recommended.
Java
Android
// Deleting collections from an Android client is not recommended.

Dart

Das Löschen von Sammlungen vom 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)
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

Eine TTL-Richtlinie legt ein bestimmtes Feld als Ablaufzeit für Dokumente in einer bestimmten Sammlungsgruppe fest. 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.

Jobs zum gleichzeitigen Löschen mehrerer Apps

Firestore unterstützt mehrere Tools zum gleichzeitigen Löschen mehrerer Apps. Sie sollten ein Tool basierend auf der Anzahl der zu löschenden Dokumente und dem erforderlichen Grad der Konfigurierbarkeit auswählen.

Verwenden Sie für kleinere Jobs mit Tausenden von Dokumenten die Console oder die Firebase CLI. Bei größeren Jobs kann es zu Zeitüberschreitungen kommen und Sie müssen das Tool mehrmals ausführen.

Console

Sie können Dokumente und Sammlungen auf der Firestore-Seite in der Console löschen. Wenn Sie ein Dokument in der Console 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 Löschen im Bulk

Firestore unterstützt das gleichzeitige Löschen mehrerer Sammlungsgruppen. 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 ist am besten konfigurierbar, erfordert aber auch mehr Einrichtung als andere Optionen zum Löschen im Bulk. Im Blogpost Einführung in den Firestore-Connector für Dataflow finden Sie ein Beispiel für das Löschen aller Dokumente in einer Sammlungsgruppe.