Android

How delete a collection or subcollection from Firestore?

Как удалить коллекцию или вложенную коллекцию из Firestore?

У меня есть коллекция под названием списки, и в ней есть документы, идентификатор которых представляет идентификатор списка. В этом документе есть коллекция с именем employees и еще одна с именем locations.

Структура выглядит следующим образом:

(lists)
-listId
(employees)
(locations)

Если пользователь хочет удалить определенный список, то проблема в том, что мы не можем удалить ListID, потому что это сохранит коллекцию (как упоминалось в документах Firestore).

Как можно смоделировать структуру в соответствии с потребностями? Кажется, я не могу обойти необходимость во вложенной коллекции.

Есть какие-нибудь рекомендации?

Переведено автоматически
Ответ 1

Нет необходимости реструктурировать вашу базу данных для удаления некоторых коллекций. Чтобы удалить всю коллекцию или вложенную коллекцию в облачном Firestore, извлеките все документы из коллекции или вложенной коллекции и удалите их. Итак, чтобы удалить определенный список, пожалуйста, выполните следующие действия:


  1. Найдите все документы в разделе employees коллекция и удалите их

  2. Найдите все документы в разделе locations коллекция и удалите их

  3. Удалить listId документ

Если у вас коллекции большего размера, вы можете захотеть удалять документы меньшими пакетами, чтобы избежать ошибок из-за нехватки памяти. Повторяйте процесс, пока не удалите всю коллекцию или вложенную коллекцию.

Даже если команда Firebase не рекомендует операцию удаления из-за этого has negative security and performance implications, вы все равно можете это сделать, но только для небольших коллекций. Если вам нужно удалить целые коллекции для web, делайте это только из доверенной серверной среды.

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

private void deleteCollection(final CollectionReference collection, Executor executor) {
Tasks.call(executor, () -> {
int batchSize = 10;
Query query = collection.orderBy(FieldPath.documentId()).limit(batchSize);
List<DocumentSnapshot> 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<DocumentSnapshot> 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();
}
java android firebase google-cloud-firestore