Elimina i dati da Cloud Firestore

I seguenti esempi mostrano come eliminare documenti, campi e raccolte.

Per l'assistenza AI, copia il prompt di seguito nel tuo agente di programmazione AI (come Gemini in Android Studio, Antigravity, Claude Code, Codex e Cursor). Puoi personalizzare il prompt e ripetere l'operazione con l'agente. Visita la pagina Skill dell'agente Firebase per informazioni dettagliate sull'installazione.

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.

Elimina documenti

Per eliminare un documento, utilizza i seguenti metodi delete() specifici per il linguaggio:

Web

Utilizza il metodo deleteDoc():

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

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

Web

Utilizza il metodo delete():

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

Utilizza il metodo delete():

Nota:questo prodotto non è disponibile su watchOS e App Clip.
do {
  try await db.collection("cities").document("DC").delete()
  print("Document successfully removed!")
} catch {
  print("Error removing document: \(error)")
}
Objective-C

Utilizza il metodo deleteDocumentWithCompletion::

Nota:questo prodotto non è disponibile su watchOS e 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

Utilizza il metodo delete():

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

Java

Utilizza il metodo 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

Utilizza il metodo delete():

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

Utilizza il metodo delete():

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

Utilizza il metodo delete():

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

Python

Utilizza il metodo delete():

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

Utilizza il metodo 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

Utilizza il metodo delete():

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

Utilizza il metodo 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

Utilizza il metodo delete():

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

Utilizza il metodo DeleteAsync():

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

Utilizza il metodo DeleteAsync():

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

Utilizza il metodo delete():

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

Quando elimini un documento, Cloud Firestore non elimina automaticamente i documenti all'interno delle sue raccolte secondarie. Puoi comunque accedere ai documenti della raccolta secondaria tramite riferimento. Ad esempio, puoi accedere al documento nel percorso /mycoll/mydoc/mysubcoll/mysubdoc anche se elimini il documento principale in /mycoll/mydoc.

I documenti principali inesistenti vengono visualizzati nella console, ma non nei risultati delle query e negli snapshot.

Se vuoi eliminare un documento e tutti i documenti all'interno delle sue raccolte secondarie, devi farlo manualmente. Per saperne di più, consulta Elimina raccolte.

Elimina campi

Per eliminare campi specifici da un documento, utilizza i seguenti metodi FieldValue.delete() specifici per il linguaggio quando aggiorni un documento:

Web

Utilizza il metodo 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

Utilizza il metodo 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

Utilizza il metodo FieldValue.delete():

Nota:questo prodotto non è disponibile su watchOS e 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

Utilizza il metodo fieldValueForDelete::

Nota:questo prodotto non è disponibile su watchOS e 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

Utilizza il metodo 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

Utilizza il metodo 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

Utilizza il metodo 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

Utilizza il metodo 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

Utilizza il metodo firestore.DELETE_FIELD:

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

Python

Utilizza il metodo firestore.DELETE_FIELD:

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

Utilizza il metodo FieldValue::Delete():

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

Utilizza il metodo 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()
});
Vai

Utilizza il metodo 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

Utilizza il metodo FieldValue::deleteField():

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

Utilizza il metodo FieldValue.Delete:

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

Utilizza il metodo 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

Utilizza il metodo firestore.field_delete:

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

Eliminare le raccolte

Per eliminare un'intera raccolta o sottoraccolta in Cloud Firestore, recupera (leggi) tutti i documenti all'interno della raccolta o della sottoraccolta ed eliminali. Questo processo comporta costi di lettura ed eliminazione. Se hai raccolte più grandi, ti consigliamo di eliminare i documenti in batch più piccoli per evitare errori di memoria esaurita. Ripeti la procedura fino a eliminare l'intera raccolta o raccolta secondaria.

L'eliminazione di una raccolta richiede il coordinamento di un numero illimitato di singole richieste di eliminazione. Se devi eliminare intere raccolte, fallo solo da un ambiente server attendibile. Sebbene sia possibile eliminare una raccolta da un client web/mobile, questa operazione ha implicazioni negative in termini di sicurezza e prestazioni.

I seguenti snippet sono semplificati per chiarezza e non includono la gestione degli errori, la sicurezza, l'eliminazione di sottoraccolte o le ottimizzazioni delle prestazioni. Per scoprire di più su un approccio consigliato per l'eliminazione delle raccolte in produzione, consulta Eliminazione di raccolte e sottoraccolte.

Web
// Deleting collections from a Web client is not recommended.
Swift
Nota:questo prodotto non è disponibile su watchOS e App Clip.
// Deleting collections from an Apple client is not recommended.
Objective-C
Nota:questo prodotto non è disponibile su watchOS e 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

L'eliminazione delle raccolte dal client non è consigliata.

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);
}
Vai

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

Elimina i dati con le policy TTL

Una policy TTL designa un determinato campo come data e ora di scadenza per i documenti di un determinato gruppo di raccolte. Le operazioni di eliminazione TTL vengono conteggiate ai fini dei costi di eliminazione dei documenti.

Per informazioni sull'impostazione del TTL, consulta Gestisci la conservazione dei dati con le policy TTL.

Job di eliminazione collettiva

Cloud Firestore supporta diversi strumenti per l'eliminazione collettiva. Devi selezionare uno strumento in base al numero di documenti che devi eliminare e al livello di configurabilità di cui hai bisogno.

Per job più piccoli di migliaia di documenti, utilizza la console o l'interfaccia a riga di comando di Firebase. Per i job più grandi, questi strumenti potrebbero iniziare ad andare in timeout e richiedere l'esecuzione più volte.

Console

Puoi eliminare documenti e raccolte dalla pagina Cloud Firestore nella console. L'eliminazione di un documento dalla console elimina tutti i dati nidificati in quel documento, incluse eventuali sottoraccolte.

Interfaccia a riga di comando di Firebase

Puoi anche utilizzare l'interfaccia a riga di comando di Firebase per eliminare documenti e raccolte. Utilizza il seguente comando per eliminare i dati:

firebase firestore:delete  --database=DATABASE_ID PATH

Sostituisci DATABASE_ID con l'ID del tuo database e PATH con un percorso a un documento o una raccolta.

Per job di eliminazione di grandi dimensioni (milioni di documenti), utilizza una delle seguenti opzioni:

Eliminazione collettiva gestita

Cloud Firestore supporta l'eliminazione collettiva di uno o più gruppi di raccolte. Per saperne di più, consulta Elimina dati in blocco.

Connettore Dataflow

Puoi utilizzare Dataflow per le operazioni collettive sul tuo database. Questa opzione è la più configurabile, ma richiede anche una configurazione maggiore rispetto ad altre opzioni di eliminazione collettiva. Il blog post Introduzione al connettore Cloud Firestore per Dataflow contiene un esempio di eliminazione di tutti i documenti in un gruppo di raccolte.