מחק נתונים באמצעות פונקציית ענן הניתנת להתקשרות

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

דרכים אחרות אוסף מחיק, לראות נתוני Delete .

פתרון: מחק נתונים בעזרת פונקציית ענן ניתנת להתקשרות

מחיקת אוספים שלמים מאפליקציה ניידת המוגבלת במשאבים יכולה להיות קשה ליישום מהסיבות הבאות:

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

למרבה המזל, אתה יכול לכתוב פונקצית ענן callable לרוץ מוחקת בטוחה performant של קולקציות שלמות או עצי אוסף. פונקצית הענן מתחת מיישמת פונקצית callable מה שאומר שזה יכול להיקרא ישירות לאפליקציה או לאתר הנייד שלך כפי שהיית עושה עבור פונקציה מקומית.

כדי לפרוס את הפונקציה ונסה הדגמה, לראות את דוגמת הקוד .

פונקציית ענן

פונקציית הענן שלהלן מוחקת אוסף וכל צאצאיו.

במקום ליישם היגיון מחיק רקורסיבית משלך עבור הפונקציה קלאוד שלך, אתה יכול לנצל את firestore:delete פקוד ממשק שורת פקודת Firebase (CLI). ניתן לייבא כל פונקציה של Firebase CLI לתוך יישום Node.js שלך באמצעות firebase-tools החבילה.

Firebase CLI משתמש ב- Cloud Firestore REST API כדי למצוא את כל המסמכים מתחת לנתיב שצוין ולמחוק אותם בנפרד. יישום זה אינו דורש ידע בהיררכית הנתונים הספציפית של האפליקציה שלך ואף ימצא וימחק מסמכים "מיותמים" שכבר אין להם אב.

Node.js

/**
 * Initiate a recursive delete of documents at a given path.
 * 
 * The calling user must be authenticated and have the custom "admin" attribute
 * set to true on the auth token.
 * 
 * This delete is NOT an atomic operation and it's possible
 * that it may fail after only deleting some documents.
 * 
 * @param {string} data.path the document or collection path to delete.
 */
exports.recursiveDelete = functions
  .runWith({
    timeoutSeconds: 540,
    memory: '2GB'
  })
  .https.onCall(async (data, context) => {
    // Only allow admin users to execute this function.
    if (!(context.auth && context.auth.token && context.auth.token.admin)) {
      throw new functions.https.HttpsError(
        'permission-denied',
        'Must be an administrative user to initiate delete.'
      );
    }

    const path = data.path;
    console.log(
      `User ${context.auth.uid} has requested to delete path ${path}`
    );

    // Run a recursive delete on the given document or collection path.
    // The 'token' must be set in the functions config, and can be generated
    // at the command line by running 'firebase login:ci'.
    await firebase_tools.firestore
      .delete(path, {
        project: process.env.GCLOUD_PROJECT,
        recursive: true,
        yes: true,
        token: functions.config().fb.token
      });

    return {
      path: path 
    };
  });

הזמנת לקוח

כדי לקרוא לפונקציה, קבל הפניה לפונקציה מתוך ה- SDK של Firebase והעבר את הפרמטרים הנדרשים:

אינטרנט
/**
 * Call the 'recursiveDelete' callable function with a path to initiate
 * a server-side delete.
 */
function deleteAtPath(path) {
    var deleteFn = firebase.functions().httpsCallable('recursiveDelete');
    deleteFn({ path: path })
        .then(function(result) {
            logMessage('Delete success: ' + JSON.stringify(result));
        })
        .catch(function(err) {
            logMessage('Delete failed, see console,');
            console.warn(err);
        });
}
מָהִיר
    // Snippet not yet written
    
Objective-C
    // Snippet not yet written
    

ג'אווה

/**
 * Call the 'recursiveDelete' callable function with a path to initiate
 * a server-side delete.
 */
public void deleteAtPath(String path) {
    Map<String, Object> data = new HashMap<>();
    data.put("path", path);

    HttpsCallableReference deleteFn =
            FirebaseFunctions.getInstance().getHttpsCallable("recursiveDelete");
    deleteFn.call(data)
            .addOnSuccessListener(new OnSuccessListener<HttpsCallableResult>() {
                @Override
                public void onSuccess(HttpsCallableResult httpsCallableResult) {
                    // Delete Success
                    // ...
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    // Delete failed
                    // ...
                }
            });
}

קוטלין+KTX

/**
 * Call the 'recursiveDelete' callable function with a path to initiate
 * a server-side delete.
 */
fun deleteAtPath(path: String) {
    val deleteFn = Firebase.functions.getHttpsCallable("recursiveDelete")
    deleteFn.call(hashMapOf("path" to path))
            .addOnSuccessListener {
                // Delete Success
                // ...
            }
            .addOnFailureListener {
                // Delete Failed
                // ...
            }
}

באמצעות SDK הלקוח עבור פונקציות ענן callable, מדינת האימות של המשתמשים ואת path הפרמטר מועברים בצורה חלקה לפונקציה מרחוק. עם השלמת הפונקציה, הלקוח יקבל התקשרות חזרה עם התוצאה או חריגה. כדי ללמוד על איך לקרוא לפונקציה ענן מה- Android, iOS, או פלטפורמה אחרת, לקרוא את התיעוד .

מגבלות

הפתרון המוצג לעיל מדגים מחיקת אוספים מפונקציה שניתן להתקשר אליה, אך עליך להיות מודע למגבלות הבאות:

  • עקביות - קוד לעיל מוחקת מסמכים אחד בכל פעם. אם אתה מבקש לבצע פעולות מחיקה מתמשכות, התוצאות שלך עשויות לשקף מצב שלם חלקית בו נמחקים רק מסמכים ממוקדים. אין גם ערובה לכך שפעולות המחיקה יצליחו או ייכשלו באופן אחיד, לכן היו מוכנים לטפל במקרים של מחיקה חלקית.
  • פסקי זמן - הפונקציה הנ"ל מוגדרת לפעול לתקופה מקסימלית של 540 שניות לפני שתיסגר. קוד המחיקה יכול למחוק 4000 מסמכים לשנייה במקרה הטוב. אם אתה צריך למחוק יותר מ- 2,000,000 מסמכים, עליך לשקול להפעיל את הפעולה בשרת שלך כך שלא יפסק הזמן. דוגמה כיצד למחוק אוסף משרת משלך, לראות קולקציות מחקו .