Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Usuń dane za pomocą wywoływanej funkcji chmury

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Na tej stronie opisano, jak usuwać dane za pomocą wywoływanej funkcji Cloud Functions. Po wdrożeniu tej funkcji możesz wywołać ją bezpośrednio z aplikacji mobilnej lub strony internetowej, aby rekurencyjnie usuwać dokumenty i kolekcje. Możesz na przykład użyć tego rozwiązania, aby dać wybranym użytkownikom możliwość usuwania całych kolekcji.

Aby poznać inne sposoby usuwania kolekcji, zobacz Usuwanie danych .

Rozwiązanie: Usuń dane za pomocą funkcji Cloud, którą można wywoływać

Usuwanie całych kolekcji z aplikacji mobilnej o ograniczonych zasobach może być trudne do wdrożenia z następujących powodów:

  • Nie ma operacji, która atomowo usuwa kolekcję.
  • Usunięcie dokumentu nie powoduje usunięcia dokumentów z jego podkolekcji.
  • Jeśli Twoje dokumenty zawierają dynamiczne kolekcje podrzędne, ustalenie, jakie dane należy usunąć dla danej ścieżki, może być trudne.
  • Usunięcie kolekcji ponad 500 dokumentów wymaga wielu operacji zapisu wsadowego lub setek pojedynczych usunięć.
  • W wielu aplikacjach nie należy udzielać użytkownikom końcowym uprawnień do usuwania całych kolekcji.

Na szczęście możesz napisać wywoływalną funkcję Cloud Function , aby przeprowadzać bezpieczne i wydajne usuwanie całych kolekcji lub drzew kolekcji. Poniższa funkcja Cloud Function implementuje funkcję wywoływalną, co oznacza, że ​​można ją wywołać bezpośrednio z aplikacji mobilnej lub strony internetowej, tak jak w przypadku funkcji lokalnej.

Aby wdrożyć funkcję i wypróbować wersję demonstracyjną, zobacz przykładowy kod .

Funkcja chmury

Poniższa funkcja Cloud usuwa kolekcję i wszystkie jej elementy podrzędne.

Zamiast implementować własną rekurencyjną logikę usuwania dla funkcji w chmurze, możesz skorzystać z polecenia firestore:delete w interfejsie wiersza poleceń (CLI) Firebase. Możesz zaimportować dowolną funkcję Firebase CLI do swojej aplikacji Node.js za pomocą pakietu firebase-tools .

Firebase CLI używa interfejsu API REST Cloud Firestore do wyszukiwania wszystkich dokumentów w określonej ścieżce i usuwania ich pojedynczo. Ta implementacja nie wymaga znajomości określonej hierarchii danych Twojej aplikacji, a nawet znajdzie i usunie „osierocone” dokumenty, które nie mają już elementu nadrzędnego.

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,
        force: true,
        token: functions.config().fb.token
      });

    return {
      path: path 
    };
  });

Wywołanie klienta

Aby wywołać funkcję, pobierz odwołanie do funkcji z Firebase SDK i przekaż wymagane parametry:

Sieć
/**
 * 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);
        });
}
Szybki
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
    // Snippet not yet written
    
Cel C
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
    // Snippet not yet written
    

Kotlin+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
                // ...
            }
}

Java

/**
 * 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
                    // ...
                }
            });
}

Używając zestawu SDK klienta do wywoływalnych funkcji w chmurze, stan uwierzytelnienia użytkowników i parametr path są bezproblemowo przekazywane do funkcji zdalnej. Po zakończeniu funkcji klient otrzyma wywołanie zwrotne z wynikiem lub wyjątkiem. Aby dowiedzieć się, jak wywołać funkcję chmury z systemu Android, Apple lub innej platformy, przeczytaj dokumentację .

Ograniczenia

Powyższe rozwiązanie demonstruje usuwanie kolekcji z funkcji wywoływalnej, ale należy pamiętać o następujących ograniczeniach:

  • Spójność — powyższy kod usuwa dokumenty pojedynczo. Jeśli zapytanie zostanie wysłane w trakcie trwającej operacji usuwania, wyniki mogą odzwierciedlać częściowo ukończony stan, w którym usuwane są tylko niektóre dokumenty docelowe. Nie ma również gwarancji, że operacje usuwania zakończą się powodzeniem lub niepowodzeniem, dlatego należy być przygotowanym na obsługę przypadków częściowego usunięcia.
  • Limity czasu — powyższa funkcja jest skonfigurowana do działania przez maksymalnie 540 sekund przed przekroczeniem limitu czasu. Kod kasowania może w najlepszym przypadku usunąć 4000 dokumentów na sekundę. Jeśli musisz usunąć więcej niż 2 000 000 dokumentów, powinieneś rozważyć uruchomienie operacji na własnym serwerze, aby nie przekroczyła limitu czasu. Aby zapoznać się z przykładem usuwania kolekcji z własnego serwera, zobacz Usuwanie kolekcji .