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(...)ความพยายามครั้งต่อๆ ไปหลังจากครั้งแรกจะไม่มีการดำเนินการ