ลบข้อมูลจาก Cloud Firestore

ตัวอย่างต่อไปนี้สาธิตวิธีการลบเอกสาร ฟิลด์ และคอลเลกชัน

ลบเอกสาร

หากต้องการลบเอกสาร ให้ใช้ delete() เฉพาะภาษาต่อไปนี้:

Web modular API

ใช้ deleteDoc() วิธีการ:

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

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

Web namespaced API

ใช้ delete() วิธีการ:

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

ใช้ delete() วิธีการ:

หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้งานได้บนเป้าหมาย watchOS และ App Clip
do {
  try await db.collection("cities").document("DC").delete()
  print("Document successfully removed!")
} catch {
  print("Error removing document: \(error)")
}
วัตถุประสงค์-C

ใช้เมธอด deleteDocumentWithCompletion: ::

หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้งานได้บนเป้าหมาย watchOS และ 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+KTX

ใช้ delete() วิธีการ:

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

Java

ใช้ 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

ใช้ delete() วิธีการ:

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

ใช้ delete() วิธีการ:

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

ใช้ delete() วิธีการ:

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

Python

ใช้ delete() วิธีการ:

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

ใช้ 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;
      }
    });
โหนด js

ใช้ delete() วิธีการ:

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

ใช้ 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

ใช้ delete() วิธีการ:

$db->collection('samples/php/cities')->document('DC')->delete();
ความสามัคคี

ใช้เมธอด DeleteAsync() :

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

ใช้เมธอด DeleteAsync() :

DocumentReference cityRef = db.Collection("cities").Document("DC");
await cityRef.DeleteAsync();
ทับทิม

ใช้ delete() วิธีการ:

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

เมื่อคุณลบเอกสาร Cloud Firestore จะไม่ลบเอกสารภายในคอลเลกชันย่อยโดยอัตโนมัติ คุณยังคงสามารถเข้าถึงเอกสารคอลเลกชันย่อยได้โดยการอ้างอิง ตัวอย่างเช่น คุณสามารถเข้าถึงเอกสารได้ที่พาธ /mycoll/mydoc/mysubcoll/mysubdoc แม้ว่าคุณจะลบเอกสารบรรพบุรุษที่ /mycoll/mydoc ก็ตาม

เอกสารระดับบนสุดที่ไม่มีอยู่จริง จะปรากฏในคอนโซล แต่ไม่ปรากฏในผลลัพธ์การค้นหาและสแนปชอต

หากคุณต้องการลบเอกสารและเอกสารทั้งหมดภายในคอลเลกชันย่อย คุณต้องดำเนินการด้วยตนเอง สำหรับข้อมูลเพิ่มเติม โปรดดู ลบคอลเลกชัน

ลบฟิลด์

หากต้องการลบฟิลด์เฉพาะออกจากเอกสาร ให้ใช้วิธีการ FieldValue.delete() เฉพาะภาษาต่อไปนี้ เมื่อคุณอัปเดตเอกสาร:

Web modular API

ใช้ 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 namespaced API

ใช้เมธอด 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()
});
สวิฟท์

ใช้เมธอด FieldValue.delete() :

หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้งานได้บนเป้าหมาย watchOS และ App Clip
do {

  try await db.collection("cities").document("BJ").updateData([
    "capital": FieldValue.delete(),
  ])
  print("Document successfully updated")
} catch {
  print("Error updating document: \(error)")
}
วัตถุประสงค์-C

ใช้ fieldValueForDelete: วิธีการ:

หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้งานได้บนเป้าหมาย watchOS และ 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+KTX

ใช้เมธอด 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

ใช้เมธอด 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

ใช้เมธอด 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);
ชวา

ใช้เมธอด 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());
หลาม

ใช้เมธอด firestore.DELETE_FIELD :

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

Python

ใช้เมธอด firestore.DELETE_FIELD :

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

ใช้เมธอด FieldValue::Delete() :

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

ใช้เมธอด 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()
});
ไป

ใช้เมธอด 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

ใช้เมธอด FieldValue::deleteField() :

$cityRef = $db->collection('samples/php/cities')->document('BJ');
$cityRef->update([
    ['path' => 'capital', 'value' => FieldValue::deleteField()]
]);
ความสามัคคี

ใช้เมธอด FieldValue.Delete :

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

ใช้เมธอด FieldValue.Delete :

DocumentReference cityRef = db.Collection("cities").Document("BJ");
Dictionary<string, object> updates = new Dictionary<string, object>
{
    { "Capital", FieldValue.Delete }
};
await cityRef.UpdateAsync(updates);
ทับทิม

ใช้เมธอด firestore.field_delete :

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

ลบคอลเลกชัน

หากต้องการลบคอลเลกชันหรือคอลเลกชันย่อยทั้งหมดใน Cloud Firestore ให้ดึง (อ่าน) เอกสารทั้งหมดภายในคอลเลกชันหรือคอลเลกชันย่อยแล้วลบออก กระบวนการนี้มีค่าใช้จ่ายทั้งการอ่านและการลบ หากคุณมีคอลเลกชันขนาดใหญ่ คุณอาจต้องการลบเอกสารเป็นกลุ่มเล็กๆ เพื่อหลีกเลี่ยงข้อผิดพลาดหน่วยความจำไม่เพียงพอ ทำซ้ำขั้นตอนนี้จนกว่าคุณจะลบคอลเลกชันหรือคอลเลกชันย่อยทั้งหมด

การลบคอลเลกชันจำเป็นต้องประสานคำขอลบแต่ละรายการโดยไม่จำกัดจำนวน หากคุณต้องการลบคอลเลกชันทั้งหมด ให้ดำเนินการจากสภาพแวดล้อมเซิร์ฟเวอร์ที่เชื่อถือได้เท่านั้น แม้ว่าจะสามารถลบคอลเลกชันออกจากไคลเอนต์มือถือ/เว็บได้ แต่การกระทำดังกล่าวมีผลกระทบเชิงลบต่อความปลอดภัยและประสิทธิภาพ

ตัวอย่างด้านล่างค่อนข้างเรียบง่ายและไม่เกี่ยวข้องกับการจัดการข้อผิดพลาด ความปลอดภัย การลบคอลเลกชันย่อย หรือการเพิ่มประสิทธิภาพสูงสุด หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการที่แนะนำหนึ่งวิธีในการลบคอลเลกชันในการใช้งานจริง โปรดดูที่ การลบคอลเลกชันและคอลเลกชันย่อย

เว็บ
// Deleting collections from a Web client is not recommended.
สวิฟท์
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้งานได้บนเป้าหมาย watchOS และ App Clip
// Deleting collections from an Apple client is not recommended.
วัตถุประสงค์-C
หมายเหตุ: ผลิตภัณฑ์นี้ไม่สามารถใช้งานได้บนเป้าหมาย watchOS และ App Clip
// Deleting collections from an Apple client is not recommended.
  

Kotlin+KTX

// Deleting collections from an Android client is not recommended.

Java

// Deleting collections from an Android client is not recommended.

Dart

ไม่แนะนำให้ลบคอลเลกชันออกจากไคลเอนต์

ชวา
/**
 * Delete a collection in batches to avoid out-of-memory errors. Batch size may be tuned based on
 * document size (atmost 1MB) and application requirements.
 */
void deleteCollection(CollectionReference collection, int batchSize) {
  try {
    // retrieve a small batch of documents to avoid out-of-memory errors
    ApiFuture<QuerySnapshot> future = collection.limit(batchSize).get();
    int deleted = 0;
    // future.get() blocks on document retrieval
    List<QueryDocumentSnapshot> documents = future.get().getDocuments();
    for (QueryDocumentSnapshot document : documents) {
      document.getReference().delete();
      ++deleted;
    }
    if (deleted >= batchSize) {
      // retrieve and delete another batch
      deleteCollection(collection, batchSize);
    }
  } catch (Exception e) {
    System.err.println("Error deleting collection : " + e.getMessage());
  }
}
หลาม
def delete_collection(coll_ref, batch_size):
    if batch_size == 0:
        return

    docs = coll_ref.list_documents(page_size=batch_size)
    deleted = 0

    for doc in docs:
        print(f"Deleting doc {doc.id} => {doc.get().to_dict()}")
        doc.delete()
        deleted = deleted + 1

    if deleted >= batch_size:
        return delete_collection(coll_ref, batch_size)

Python

async def delete_collection(coll_ref, batch_size):
    docs = coll_ref.limit(batch_size).stream()
    deleted = 0

    async for doc in docs:
        print(f"Deleting doc {doc.id} => {doc.to_dict()}")
        await doc.reference.delete()
        deleted = deleted + 1

    if deleted >= batch_size:
        return delete_collection(coll_ref, batch_size)
ซี++
// This is not supported. Delete data using CLI as discussed below.
  
โหนด js
async function deleteCollection(db, collectionPath, batchSize) {
  const collectionRef = db.collection(collectionPath);
  const query = collectionRef.orderBy('__name__').limit(batchSize);

  return new Promise((resolve, reject) => {
    deleteQueryBatch(db, query, resolve).catch(reject);
  });
}

async function deleteQueryBatch(db, query, resolve) {
  const snapshot = await query.get();

  const batchSize = snapshot.size;
  if (batchSize === 0) {
    // When there are no documents left, we are done
    resolve();
    return;
  }

  // Delete documents in a batch
  const batch = db.batch();
  snapshot.docs.forEach((doc) => {
    batch.delete(doc.ref);
  });
  await batch.commit();

  // Recurse on the next process tick, to avoid
  // exploding the stack.
  process.nextTick(() => {
    deleteQueryBatch(db, query, resolve);
  });
}
ไป

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();
    }
}
ความสามัคคี
// This is not supported. Delete data using CLI as discussed below.
ค#
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.");
}
ทับทิม
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

ลบข้อมูลด้วย Firebase CLI

คุณยังสามารถใช้ Firebase CLI เพื่อลบเอกสารและคอลเลกชันได้ ใช้คำสั่งต่อไปนี้เพื่อลบข้อมูล:

firebase firestore:delete [options] <<path>>

ลบข้อมูลด้วยคอนโซล

คุณสามารถ ลบเอกสารและคอลเลกชันได้จากหน้า Cloud Firestore ในคอนโซล การลบเอกสารออกจากคอนโซลจะลบข้อมูลที่ซ้อนกันทั้งหมดในเอกสารนั้น รวมถึงคอลเล็กชันย่อยด้วย

ลบข้อมูลด้วยนโยบาย TTL

นโยบาย TTL กำหนดฟิลด์ที่กำหนดเป็นเวลาหมดอายุสำหรับเอกสารในกลุ่มคอลเลกชันที่กำหนด การดำเนินการลบ TTL นับเป็นค่าใช้จ่ายในการลบเอกสารของคุณ

สำหรับข้อมูลเกี่ยวกับการตั้งค่า TTL โปรดดู ที่จัดการการเก็บรักษาข้อมูลด้วยนโยบาย TTL

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรหัสข้อผิดพลาดและวิธีแก้ไขปัญหาเวลาแฝงเมื่อลบข้อมูล โปรดดู หน้าการแก้ไขปัญหา

ลบข้อมูลด้วย Dataflow

Dataflow เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการดำเนินการจำนวนมากในฐานข้อมูล Firestore ของคุณ โพสต์ในบล็อก แนะนำตัวเชื่อมต่อ Firestore สำหรับ Dataflow มีตัวอย่างการลบเอกสารทั้งหมดในกลุ่มคอลเลกชัน