Удаление коллекций и подколлекций в Firestore
При работе с Firestore могут возникнуть ситуации, когда вам необходимо удалить коллекции или подколлекции. Однако удаление родительского документа, в котором размещены подколлекции, сопряжено с трудностями. В этой статье рассказывается, как эффективно управлять такими ситуациями.
Структура базы данных и проблема удаления
Рассмотрим сценарий с коллекцией под названием «списки», где каждый документ представляет собой список. со своим уникальным идентификатором. В каждом документе списка есть подколлекции с именами «сотрудники» и «местоположения». Структура следующая:
(lists) -listId (employees) (locations)
Если пользователь желает удалить определенный список, при удалении документа «listId» его подколлекции сохранятся, что противоречит документации Firestore.
Решение: последовательное удаление
Для решения этой проблемы мы предлагаем метод последовательного удаления:
Этот метод обеспечивает полное удаление определенного списка и связанных с ним подколлекций.
Соображения
Хотя удаление является эффективным инструментом, 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); Listdeleted = 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