«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как эффективно удалить коллекции и подколлекции в Firestore?

Как эффективно удалить коллекции и подколлекции в Firestore?

Опубликовано 3 ноября 2024 г.
Просматривать:789

 How to Effectively Delete Collections and Subcollections in Firestore?

Удаление коллекций и подколлекций в Firestore

При работе с Firestore могут возникнуть ситуации, когда вам необходимо удалить коллекции или подколлекции. Однако удаление родительского документа, в котором размещены подколлекции, сопряжено с трудностями. В этой статье рассказывается, как эффективно управлять такими ситуациями.

Структура базы данных и проблема удаления

Рассмотрим сценарий с коллекцией под названием «списки», где каждый документ представляет собой список. со своим уникальным идентификатором. В каждом документе списка есть подколлекции с именами «сотрудники» и «местоположения». Структура следующая:

(lists)
    -listId
       (employees)
       (locations)

Если пользователь желает удалить определенный список, при удалении документа «listId» его подколлекции сохранятся, что противоречит документации Firestore.

Решение: последовательное удаление

Для решения этой проблемы мы предлагаем метод последовательного удаления:

  1. Извлеките все документы из подколлекции «сотрудники» и удалите их.
  2. Повторите процесс для подколлекция "locations".
  3. Наконец, удалите документ "listId".

Этот метод обеспечивает полное удаление определенного списка и связанных с ним подколлекций.

Соображения

Хотя удаление является эффективным инструментом, Firebase рекомендует использовать его с осторожностью, особенно для больших коллекций. Однако для небольших коллекций удаление является целесообразным вариантом. Если использование удаления для больших коллекций неизбежно, выполните его в среде доверенного сервера.

Реализация кода для Android

Для приложений Android вы можете использовать следующий код для реализовать процесс удаления:

private void deleteCollection(final CollectionReference collection, Executor executor) {
    Tasks.call(executor, () -> {
        int batchSize = 10;
        Query query = collection.orderBy(FieldPath.documentId()).limit(batchSize);
        List deleted = deleteQueryBatch(query);

        while (deleted.size() >= batchSize) {
            DocumentSnapshot last = deleted.get(deleted.size() - 1);
            query = collection.orderBy(FieldPath.documentId()).startAfter(last.getId()).limit(batchSize);

            deleted = deleteQueryBatch(query);
        }

        return null;
    });
}

@WorkerThread
private List deleteQueryBatch(final Query query) throws Exception {
    QuerySnapshot querySnapshot = Tasks.await(query.get());

    WriteBatch batch = query.getFirestore().batch();
    for (DocumentSnapshot snapshot : querySnapshot) {
        batch.delete(snapshot.getReference());
    }
    Tasks.await(batch.commit());

    return querySnapshot.getDocuments();
}

Этот код извлекает и удаляет документы в пакетном режиме, обеспечивая удаление как коллекции, так и ее подколлекций.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3