Usuwanie danych z Cloud Firestore

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

Usuwanie dokumentów

Aby usunąć dokument, użyj tych metod delete() specyficznych dla danego 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 watchOS ani w przypadku elementów docelowych 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 watchOS ani w przypadku elementów docelowych 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 kolekcjach podrzędnych. Nadal możesz uzyskać dostęp do dokumentów w kolekcjach podrzędnych za pomocą odniesienia. 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 są widoczne w konsoli, ale nie pojawiają się w wynikach zapytań ani zrzutach.

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

Usuwanie pól

Aby usunąć określone pola z dokumentu, podczas aktualizowania dokumentu użyj tych metod FieldValue.delete() specyficznych dla danego 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 watchOS ani w przypadku elementów docelowych 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 watchOS ani w przypadku elementów docelowych 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 kolekcję podrzędną w Cloud Firestore, pobierz (odczytaj) wszystkie dokumenty w kolekcji lub kolekcji podrzędnej 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 braku pamięci. Powtarzaj ten proces, aż usuniesz całą kolekcję lub kolekcję podrzędną.

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 dla przejrzystości i nie obejmują obsługi błędów, zabezpieczeń, usuwania kolekcji podrzędnych ani optymalizacji wydajności. Więcej informacji o jednym z zalecanych sposobów usuwania kolekcji w środowisku produkcyjnym znajdziesz w artykule Usuwanie kolekcji i kolekcji podrzędnych.

Sieć
// Deleting collections from a Web client is not recommended.
Swift
Uwaga: ta usługa nie jest dostępna w watchOS ani w przypadku elementów docelowych App Clip.
// Deleting collections from an Apple client is not recommended.
Objective-C
Uwaga: ta usługa nie jest dostępna w watchOS ani w przypadku elementów docelowych 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 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 wyznacza dane pole jako czas wygaśnięcia dokumentów w danej grupie kolekcji. Operacje usunięcia na podstawie TTL są wliczane do kosztów usunięcia dokumentu.

Więcej informacji o ustawianiu TTL znajdziesz w artykule Zarządzanie przechowywaniem danych za pomocą zasad TTL.

Zadania zbiorczego usuwania

Cloud Firestore obsługuje kilka narzędzi do zbiorczego usuwania. Narzędzie należy wybrać na podstawie liczby dokumentów, które trzeba usunąć, oraz wymaganego poziomu konfigurowalności.

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

Konsola

Dokumenty i kolekcje możesz usuwać 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 kolekcji podrzędnych.

Wiersz poleceń Firebase

Do usuwania dokumentów i kolekcji możesz też użyć 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 (milionów dokumentów) użyj jednej z tych opcji:

Zarządzane usuwanie zbiorcze

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

Łącznik Dataflow

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