อัปเดต

ระยะ update(...) จะอัปเดตเอกสารที่มีอยู่

ตัวอย่าง

ตัวอย่างเช่น การดำเนินการต่อไปนี้จะเติมข้อมูลย้อนหลังการเปลี่ยนแปลงโมเดลข้อมูลลงในเอกสารทั้งหมดในกลุ่มคอลเล็กชัน ไปป์ไลน์จะเพิ่มช่อง preferences.color ลงในเอกสารทั้งหมดในกลุ่มคอลเล็กชัน users ที่ไม่มีช่องดังกล่าว

Node.js
const snapshot = await db.pipeline()
   .collectionGroup("users")
   .where(not(exists(field("preferences.color"))))
   .addFields(constant(null).as("preferences.color"))
   .removeFields("color")
   .update()
   .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Constant, Field, Not

snapshot = (
    client.pipeline()
    .collection_group("users")
    .where(Not(Field.of("preferences.color").exists()))
    .add_fields(Constant.of(None).as_("preferences.color"))
    .remove_fields("color")
    .update()
    .execute()
)
Java
Pipeline.Snapshot snapshot = firestore.pipeline()
   .collectionGroup("users")
   .where(not(exists(field("preferences.color"))))
   .addFields(constant((String) null).as("preferences.color"))
   .removeFields("color")
   .update()
   .execute().get();
Go
snapshot := client.Pipeline().
	CollectionGroup("users").
	Where(firestore.Not(firestore.FieldExists(firestore.FieldOf("preferences.color")))).
	AddFields(firestore.Selectables(
		firestore.ConstantOfNull().As("preferences.color"),
	)).
	RemoveFields(firestore.Fields("color")).
	Update().
	Execute(ctx)

พฤติกรรม

ระยะภาษาในการจัดการข้อมูล (DML) ทั้งหมดต้องอยู่ท้ายไปป์ไลน์

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

คุณสามารถระบุ transformations ที่จะใช้ก่อนเขียนเอกสารได้โดยไม่บังคับ ซึ่งจะทำงานเหมือนกับการเพิ่ม add_fields(...) ก่อนระยะเอาต์พุตสุดท้าย และ นิพจน์จะทำงานในบริบทของเอกสารก่อนหน้า

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

{documents_modified: 3L}

ข้อจำกัด

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

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

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