מחק

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();
המשך
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(...)).

התשובה כוללת סיכום של מספר המסמכים ששונו. לדוגמה, התגובה הבאה מאשרת שצינור העיבוד שינה שלושה מסמכים:

{documents_modified: 3L}

מגבלות

  • שלבי ה-DML לא תומכים ב-Cloud Firestore Security Rules. ניסיונות לבצע פעולות DML דרך Cloud Firestore Security Rules נדחים.

  • במהלך תקופת הבדיקה של התכונה הזו, אי אפשר להריץ שלבים של DML בטרנזקציה. מידע נוסף על התנהגות העקביות זמין במאמר בנושא עקביות.

  • אם השלב שלפני שלב ה-DML יוצר כמה מסמכים עם אותו __name__, כל מופע מעובד. במקרה של update(...), יכול להיות שאותו מסמך יעד ישונה כמה פעמים. במקרה של delete(...), ניסיונות חוזרים אחרי הניסיון הראשון לא יבצעו פעולה.