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

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

หากต้องการความช่วยเหลือจาก AI ให้คัดลอกพรอมต์ด้านล่างลงในตัวแทนการเขียนโค้ด AI (เช่น Gemini ใน Android Studio, Antigravity, Claude Code, Codex และ Cursor) คุณสามารถปรับแต่งพรอมต์และปรับปรุงซ้ำๆ กับ Agent ได้ ดูข้อมูลการติดตั้งโดยละเอียดได้ที่ทักษะเอเจนต์ 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.

ลบเอกสาร

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

Web

ใช้เมธอด deleteDoc() ดังนี้

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

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

Web

ใช้เมธอด delete() ดังนี้

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

ใช้เมธอด delete() ดังนี้

หมายเหตุ: ผลิตภัณฑ์นี้ใช้ไม่ได้กับเป้าหมาย watchOS และ App Clip
do {
  try await db.collection("cities").document("DC").delete()
  print("Document successfully removed!")
} catch {
  print("Error removing document: \(error)")
}
Objective-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

ใช้เมธอด 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"),
    );
Java

ใช้เมธอด delete() ดังนี้

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

ใช้เมธอด delete() ดังนี้

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

Python

ใช้เมธอด delete() ดังนี้

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

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

ใช้เมธอด delete() ดังนี้

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

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

ใช้เมธอด DeleteAsync() ดังนี้

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

ใช้เมธอด DeleteAsync() ดังนี้

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

ใช้เมธอด delete() ดังนี้

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

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

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

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

ลบช่อง

หากต้องการลบช่องที่เฉพาะเจาะจงออกจากเอกสาร ให้ใช้เมธอด FieldValue.delete() ที่เจาะจงภาษาต่อไปนี้เมื่ออัปเดตเอกสาร

Web

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

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

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

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

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

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

ใช้เมธอด FieldValue::Delete() ดังนี้

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

ใช้เมธอด 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()]
]);
Unity

ใช้เมธอด FieldValue.Delete ดังนี้

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

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

ใช้เมธอด 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.
Swift
หมายเหตุ: ผลิตภัณฑ์นี้ใช้ไม่ได้กับเป้าหมาย watchOS และ App Clip
// Deleting collections from an Apple client is not recommended.
Objective-C
หมายเหตุ: ผลิตภัณฑ์นี้ใช้ไม่ได้กับเป้าหมาย watchOS และ 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

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

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

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

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

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

งานลบหลายรายการพร้อมกัน

Cloud Firestore รองรับเครื่องมือหลายอย่างสำหรับการลบหลายรายการพร้อมกัน คุณควรเลือกเครื่องมือตามจำนวนเอกสารที่ต้องการลบและระดับความสามารถในการกำหนดค่าที่ต้องการ

สำหรับงานขนาดเล็กที่มีเอกสารหลายพันรายการ ให้ใช้คอนโซลหรือ Firebase CLI สำหรับงานขนาดใหญ่ เครื่องมือเหล่านี้อาจเริ่มหมดเวลาและกำหนดให้คุณต้องเรียกใช้เครื่องมือหลายครั้ง

คอนโซล

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

Firebase CLI

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

firebase firestore:delete  --database=DATABASE_ID PATH

แทนที่ DATABASE_ID ด้วยรหัสฐานข้อมูล และ PATH ด้วยเส้นทางไปยังเอกสารหรือคอลเล็กชัน

สำหรับงานลบขนาดใหญ่ (เอกสารหลายล้านรายการ) ให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้

การลบหลายรายการพร้อมกันที่มีการจัดการ

Cloud Firestore รองรับการลบกลุ่มคอลเล็กชันอย่างน้อย 1 กลุ่มพร้อมกัน ดูข้อมูลเพิ่มเติมได้ที่ลบข้อมูลหลายรายการพร้อมกัน

เครื่องมือเชื่อมต่อ Dataflow

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