Usuwanie danych z Cloud Firestore

Poniższe przykłady pokazują, jak usuwać dokumenty, pola i kolekcje.

Aby uzyskać pomoc AI, skopiuj poniższy prompt do agenta kodowania AI (takiego jak Gemini w Android Studio, Antigravity, Claude Code, Codex czy Cursor). Możesz dostosować prompta i wprowadzać zmiany z agentem. Szczegółowe informacje o instalacji znajdziesz w artykule Umiejętności agenta Firebase.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me delete documents, fields, and collections from Cloud Firestore in my app.

Usuń dokumenty

Aby usunąć dokument, użyj tych metod delete() zależnych od języka:

Web

Użyj metody deleteDoc():

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

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

Web

Użyj metody delete():

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

Użyj metody delete():

Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
do {
  try await db.collection("cities").document("DC").delete()
  print("Document successfully removed!")
} catch {
  print("Error removing document: \(error)")
}
Objective-C

Użyj metody deleteDocumentWithCompletion::

Uwaga: ta usługa nie jest dostępna w przypadku watchOS i 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

Użyj metody delete():

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

Java

Użyj metody 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

Użyj metody delete():

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

Użyj metody delete():

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

Użyj metody delete():

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

Python

Użyj metody delete():

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

Użyj metody 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

Użyj metody delete():

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

Użyj metody 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

Użyj metody delete():

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

Użyj metody DeleteAsync():

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

Użyj metody DeleteAsync():

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

Użyj metody delete():

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

Gdy usuniesz dokument, Cloud Firestore nie usunie automatycznie dokumentów w jego podkolekcjach. Nadal możesz uzyskać dostęp do dokumentów podkolekcji przez odwołanie. Możesz na przykład uzyskać dostęp do dokumentu w ścieżce /mycoll/mydoc/mysubcoll/mysubdoc, nawet jeśli usuniesz dokument nadrzędny w ścieżce /mycoll/mydoc.

Nieistniejące dokumenty nadrzędne pojawiają się w konsoli, ale nie są widoczne w wynikach zapytań ani w zrzutach.

Jeśli chcesz usunąć dokument i wszystkie dokumenty w jego podkolekcjach, musisz to zrobić ręcznie. Więcej informacji znajdziesz w artykule Usuwanie kolekcji.

Usuwanie pól

Aby usunąć określone pola z dokumentu, podczas aktualizowania dokumentu użyj tych metod FieldValue.delete() dla konkretnego języka:

Web

Użyj metody 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

Użyj metody 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

Użyj metody FieldValue.delete():

Uwaga: ta usługa nie jest dostępna w przypadku watchOS i 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

Użyj metody fieldValueForDelete::

Uwaga: ta usługa nie jest dostępna w przypadku watchOS i 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

Użyj metody 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

Użyj metody 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

Użyj metody 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

Użyj metody 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

Użyj metody firestore.DELETE_FIELD:

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

Python

Użyj metody firestore.DELETE_FIELD:

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

Użyj metody FieldValue::Delete():

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

Użyj metody 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

Użyj metody 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

Użyj metody FieldValue::deleteField():

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

Użyj metody FieldValue.Delete:

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

Użyj metody 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

Użyj metody firestore.field_delete:

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

Usuwanie kolekcji

Aby usunąć całą kolekcję lub podkolekcję w Cloud Firestore, pobierz (odczytaj) wszystkie dokumenty w kolekcji lub podkolekcji i usuń je. Ten proces wiąże się z kosztami odczytu i usunięcia. Jeśli masz większe kolekcje, możesz usuwać dokumenty w mniejszych partiach, aby uniknąć błędów związanych z brakiem pamięci. Powtarzaj ten proces, aż usuniesz całą kolekcję lub podkolekcję.

Usunięcie kolekcji wymaga skoordynowania nieograniczonej liczby pojedynczych żądań usunięcia. Jeśli musisz usunąć całe kolekcje, rób to tylko w zaufanym środowisku serwera. Chociaż można usunąć kolekcję z klienta mobilnego lub internetowego, ma to negatywny wpływ na bezpieczeństwo i wydajność.

Poniższe fragmenty kodu zostały uproszczone w celu uniknięcia wątpliwości i nie obejmują obsługi błędów, zabezpieczeń, usuwania podkolekcji ani optymalizacji wydajności. Więcej informacji o zalecanym podejściu do usuwania kolekcji w środowisku produkcyjnym znajdziesz w artykule Usuwanie kolekcji i podkolekcji.

Sieć
// Deleting collections from a Web client is not recommended.
Swift
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
// Deleting collections from an Apple client is not recommended.
Objective-C
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i 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

Nie zalecamy usuwania kolekcji z poziomu klienta.

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

Usuwanie danych za pomocą zasad TTL

Zasada TTL określa dane pole jako czas ważności dokumentów w danej grupie kolekcji. Operacje usunięcia na podstawie TTL wliczają się do kosztów usuwania dokumentów.

Informacje o ustawianiu TTL znajdziesz w artykule Zarządzanie przechowywaniem danych za pomocą zasad TTL.

Zadania usuwania zbiorczego

Cloud Firestore obsługuje kilka narzędzi do usuwania zbiorczego. Wybierz narzędzie na podstawie liczby dokumentów, które chcesz usunąć, oraz wymaganego poziomu możliwości konfiguracji.

W przypadku mniejszych zadań obejmujących tysiące dokumentów użyj konsoli lub interfejsu wiersza poleceń Firebase. W przypadku większych zadań te narzędzia mogą zacząć przekraczać limit czasu i wymagać wielokrotnego uruchomienia.

Konsola

Możesz usunąć dokumenty i kolekcje na stronie Cloud Firestore w konsoli. Usunięcie dokumentu z konsoli powoduje usunięcie wszystkich zagnieżdżonych danych w tym dokumencie, w tym wszystkich podkolekcji.

wiersz poleceń Firebase

Do usuwania dokumentów i kolekcji możesz też używać interfejsu wiersza poleceń Firebase. Aby usunąć dane, użyj tego polecenia:

firebase firestore:delete  --database=DATABASE_ID PATH

Zastąp DATABASE_ID identyfikatorem bazy danych, a PATH – ścieżką do dokumentu lub kolekcji.

W przypadku dużych zadań usuwania (miliony dokumentów) użyj jednej z tych metod:

Zarządzane usuwanie zbiorcze

Cloud Firestore obsługuje zbiorcze usuwanie co najmniej 1 grupy kolekcji. Więcej informacji znajdziesz w artykule Zbiorcze usuwanie danych.

Oprogramowanie sprzęgające Dataflow

Do wykonywania operacji zbiorczych na bazie danych możesz używać Dataflow. Ta opcja jest najbardziej konfigurowalna, ale wymaga też więcej konfiguracji niż inne opcje usuwania zbiorczego. W poście na blogu dotyczącym wprowadzenia do oprogramowania sprzęgającego Cloud Firestore dla Dataflow znajdziesz przykład usuwania wszystkich dokumentów w grupie kolekcji.