Удаление всех документов и коллекций из Firestore - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь очистить базу данных Firestore, которая была заполнена большим количеством документов и вложенных коллекций для целей тестирования. Интерфейс Firebase CLI (firebase-tools@3.18.4) предлагает следующую возможность удаления данных из Cloud Firestore:

Использование: firestore: удалить [опции] [путь]

Параметры:

-r, --recursive    Recursive. Delete all documents and subcollections. Any action which would result in the deletion of child documents will fail if this argument is not passed. May not be passed along with --shallow.
--shallow          Shallow. Delete only parent documents and ignore documents in subcollections. Any action which would orphan documents will fail if this argument is not passed. May not be passed along with -r.
--all-collections  Delete all. Deletes the entire Firestore database, including all collections and documents. Any other flags or arguments will be ignored.
-y, --yes          No confirmation. Otherwise, a confirmation prompt will appear.

Проблема в том, что у меня это не работает.

Выполнение firebase firestore:delete --all-collections дает следующий вывод:

You are about to delete YOUR ENTIRE DATABASE. Are you sure? Yes
Deleting the following collections: 13OPlWrRit5PoaAbM0Rk, 17lHmJpTKVn1MBBbC169, 18LvlhhaCA1tygJYqIDt, 1DgDspzJwSEZrYxeM5G6, 1GQE7ySki4MhXxAeAzpx, 1MhoDe5JZY8Lz3yd7rVl, 1NOZ7OJeqSKl38dyh5Sw, 1Rxkjpgmr3gKvYhBJX29, 1S3mAhzQMd137Eli7qAp, 1S8FZxuefpIWBGx0hJW2, 1a7viEplYa79eNNus5xC, 1cgzMxAayzSkZv2iZf6e, 1dGjESrw6j12hEOqMpky, 1dbfgFD5teTXvQ6Ym897, 1eeYQgv2BJIS0aFWPksD, 1ehWNAZ0uKwg7mPXt3go, 1fDTkbwrXmGwZlFUl3zi, 1k5bk4aiMCuPw2KvCoAl, 1pxUSDh1YqkQAcuUH9Ie, 1rMSZ5Ru0cAfdcjY0Ljy
Deleted 92 docs (652 docs/s)

Даже после многократного выполнения этой функции в базе данных Firestore остается огромное количество документов и вложенных коллекций. Вместо удаления ENTIRE DATABASE при выполнении команды удаляется только около 70-150 документов.

Как можно удалить всю базу данных?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы захотите использовать admin sdk для этой задачи. Используйте .listDocuments и .listCollections для построения простых итераций для выполнения ваших .delete операций с.

Если ответ документов .listCollections имеет нулевую длину или null или пуст, вы знаете, что подколлекций нет, и можете выполнить итерацию в / пропустить. Иначе, повторяйте, что документы вложенных коллекций ищут более глубокие вложенные коллекции, чтобы удалить.

let documentRef = firestore.doc('col/doc');

documentRef.listCollections().then(collections => {
  for (let collection of collections) {
    console.log(`Found subcollection with id: ${collection.id}`);
  }
});

и

let collectionRef = firestore.collection('col');

return collectionRef.listDocuments().then(documentRefs => {
   return firestore.getAll(documentRefs);
}).then(documentSnapshots => {
   for (let documentSnapshot of documentSnapshots) {
      if (documentSnapshot.exists) {
        console.log(`Found document with data: ${documentSnapshot.id}`);
      } else {
        console.log(`Found missing document: ${documentSnapshot.id}`);
      }
   }
});
0 голосов
/ 16 февраля 2019

Я сообщил об этом как об ошибке и получил следующий ответ:

В настоящее время это предполагаемое поведение. Как указано в нашей документации , удаление коллекции из более чем 500 документов требует нескольких пакетных операций. Таким образом, выполнение итерации будет хорошим способом обработки случаев частичного удаления. Я бы также посоветовал вам ознакомиться с нашими документами относительно некоторых вызываемых функций ограничения для получения более подробной информации.

Это означает, что firebase-tools всегда удаляет не более 500 документов за одну операцию. Мое решение удалить все коллекции и документы в базе данных - использовать цикл while:

while firebase firestore:delete --all-collections --project MYPROJECT -y; do :; done

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

...