ลบ

delete() เป็นขั้นตอนภาษาในการจัดการข้อมูล (DML) ที่อนุญาตให้คิวรีนำเอกสารออกตามผลลัพธ์ของคิวรี คุณสามารถแนบขั้นตอนนี้ไว้ที่ส่วนท้ายของคิวรี ซึ่งจะลบเอกสารทั้งหมดที่ฟิลด์ __name__ จากขั้นตอนก่อนหน้าอ้างอิง

ตัวอย่าง

ตัวอย่างเช่น คิวรีต่อไปนี้จะลบเอกสาร users ทั้งหมดที่มี address.users ตั้งค่าเป็น USA และมี __create_time__ น้อยกว่า 10 วัน:

Node.js
const pipeline = db.pipeline()
  .collectionGroup("users")
  .where(field("address.country").equal("USA"))
  .where(field("__create_time__").timestampAdd("day", 10).lessThan(currentTimestamp()))
  .delete();
await pipeline.execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import CurrentTimestamp, Field

snapshot = (
    client.pipeline()
    .collection_group("users")
    .where(Field.of("address.country").equal("USA"))
    .where(
        Field.of("__create_time__")
        .timestamp_add("day", 10)
        .less_than(CurrentTimestamp())
    )
    .delete()
    .execute()
)
Java
Pipeline.Snapshot deleteResults = firestore.pipeline()
  .collectionGroup("users")
  .where(field("address.country").equal("USA"))
  .where(field("__create_time__").add(constant(10)).lessThan(currentTimestamp()))
  .delete()
  .execute().get();
Go
snapshot := client.Pipeline().
	CollectionGroup("users").
	Where(firestore.FieldOf("address.country").Equal("USA")).
	Where(firestore.FieldOf("__create_time__").Add(firestore.ConstantOf(10)).LessThan(firestore.CurrentTimestamp())).
	Delete().
	Execute(ctx)

พฤติกรรม

การตอบกลับ

ขั้นตอน delete() จะส่งเอกสารเดียวเสมอ เช่น { documents_modified: 28L } ซึ่งอธิบายจำนวนเอกสารที่ถูกลบ

การลบคอลเล็กชันทั้งหมด

คุณสามารถลบเอกสารทั้งหมดออกจากคอลเล็กชันได้โดยการต่อท้าย delete() ไปยังขั้นตอนอินพุต เช่น

Node.js

const results = await db.pipeline()
  .collection("/users")
  .delete()
  .execute();

ตรวจสอบว่าขั้นตอน where(...) ก่อน delete() ขั้นสุดท้ายจำกัดเอกสารอย่างเหมาะสมเพื่ออัปเดตเฉพาะเอกสารที่คาดไว้ แนวทางปฏิบัติแนะนำคือการเรียกใช้คิวรีโดยไม่มีขั้นตอน delete() ขั้นสุดท้ายก่อนเพื่อตรวจสอบว่าระบบจะนำเฉพาะเอกสารที่ต้องการออก

ขั้นตอนสุดท้าย

ขั้นตอน delete() ต้องอยู่ท้ายไปป์ไลน์ และไม่สามารถระบุขั้นตอนเพิ่มเติมได้

ลบทั้งหมด

โดยค่าเริ่มต้น ขั้นตอน delete() จะนำเอกสารทั้งหมดที่ขั้นตอนก่อนหน้าอ้างอิงออก หากต้องการจำกัดขนาดของเวิร์กโหลด หรือทราบว่าเงื่อนไขตัวกรองตรงกับเอกสารเพียงรายการเดียว คุณสามารถเพิ่ม limit(1) ก่อน delete() ขั้นสุดท้ายเพื่อจำกัดงานทั้งหมด

การเปลี่ยนแปลงคอลเล็กชันข้าม

ขั้นตอน delete() ขั้นสุดท้ายจะใช้การเปลี่ยนแปลงกับเอกสาร ใดก็ได้ ที่ __name__ อ้างอิง (โดยถือว่ามีการตรวจสอบสิทธิ์ที่จำเป็นทั้งหมด) ซึ่งรวมถึงการลบเอกสารจากคอลเล็กชันหรือกลุ่มคอลเล็กชันต่างๆ หลายรายการซึ่งเป็นส่วนหนึ่งของคำขอเดียวกัน

ต้องมี __name__

ขั้นตอน delete() กำหนดให้ขั้นตอนก่อนหน้าต้องระบุฟิลด์ __name__ ที่มีการอ้างอิงเอกสารที่จะนำออก หากไม่ดำเนินการดังกล่าวจะทำให้เกิดข้อผิดพลาดรันไทม์ และเมื่อเรียกใช้นอกธุรกรรมอาจทำให้สำเร็จบางส่วน

ขั้นตอนอินพุตส่วนใหญ่ เช่น collection(...), collection_group(...), database(...) และ documents(...), จะรวมฟิลด์ __name__ ไว้โดยค่าเริ่มต้น ดังนั้นขั้นตอนนี้จึงเกี่ยวข้องเฉพาะในกรณีที่ใช้การ ฉายภาพ (เช่น select(...)) หรือทำการ แปลงเอกสาร (เช่น aggregate(...))

การตอบกลับจะมีการสรุปจำนวนเอกสารที่แก้ไข ตัวอย่างเช่น การตอบกลับต่อไปนี้ยืนยันว่าไปป์ไลน์ได้แก้ไขเอกสาร 3 รายการ

{documents_modified: 3L}

ข้อจำกัด

  • ขั้นตอน DML ไม่รองรับ Cloud Firestore Security Rules ระบบจะปฏิเสธความพยายามในการดำเนินการ DML ผ่าน Cloud Firestore Security Rules

  • ในระหว่างพรีวิวฟีเจอร์นี้ คุณจะไม่สามารถเรียกใช้ขั้นตอน DML ในธุรกรรมได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการทำงานที่สอดคล้องกันได้ที่ ความสอดคล้องกัน

  • หากขั้นตอนก่อนหน้าขั้นตอน DML สร้างเอกสารหลายรายการที่มี __name__ เดียวกัน ระบบจะประมวลผลแต่ละอินสแตนซ์ สำหรับ update(...) หมายความว่าระบบอาจแก้ไขเอกสารเป้าหมายเดียวกันหลายครั้ง สำหรับ delete(...) ความพยายามครั้งต่อๆ ไปหลังจากครั้งแรกจะไม่มีการดำเนินการ