однократная очистка пожарной базы - PullRequest
0 голосов
/ 29 января 2020

Когда я создавал свое приложение, я писал код так, чтобы для каждого пользователя, посетившего мое приложение, было создано пустое имя пользователя c (с использованием анонимного входа в систему).

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

Я уже изменил код в своем приложении, так что пустые документы больше не создаются, но я бы как go вернуться назад и избавиться от всех старых пустых.

Какой самый простой способ сделать это?

Нужно ли мне написать функцию firebase, которая выполняет эту обязанность и вызвать его вручную?

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

Ответы [ 2 ]

1 голос
/ 29 января 2020

Для тех, кто хотел бы увидеть механизм скрипта, который делает это, я включаю код и шаги ниже:

Вы должны получить учетные данные учетной записи службы для своего проекта. Вы можете найти больше информации об этом здесь: https://firebase.google.com/docs/admin/setup

Скопируйте и обновите код для скрипта ниже.

запустите скрипт, используя node path/to/script.js из предпочитаемого вами консоль.

var admin = require("firebase-admin");

var serviceAccount = require("path/to/key.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://<PROJECT_ID>.firebaseio.com"
});
const firestore = admin.firestore();

const cleanDocs = async () => {
  const documentRefs = await firestore.collection("users").listDocuments();
  console.log(`got ${documentRefs.length} refs`);
  const documentSnapshots = await firestore.getAll(...documentRefs);
  console.log(`got ${documentSnapshots.length} snapshots`);
  let deletePromises = [];
  documentSnapshots.forEach((documentSnapshot, index) => {
    if (documentSnapshot.exists) {
      const data = documentSnapshot.data();
      if (Object.keys(data).length == 0) {
        // this user doc is empty
        deletePromises.push(documentRefs[index].delete());
      }
    } else {
      console.log(`Found missing document: ${documentSnapshot.id}`);
    }
  });
  console.log(`deleting ${deletePromises.length} documents`);
  // this next line doesn't seem to be necessary
  await Promise.all(deletePromises);
  return;
};
cleanDocs();
1 голос
/ 29 января 2020

Это может показаться удивительным, но документы без полей не могут быть запрошены, поэтому нет простого способа идентифицировать только эти документы. Работа индексов Firestore основана на содержании значений полей. Без полей нет значений для индексации, что означает, что запрашивать нечего.

Вместо этого вам придется написать код для получения всего содержимого коллекции, выполнить итерацию каждого документа, проверить его на наличие Отсутствие полей, затем удалите этот документ. Это можно сделать на рабочем столе с помощью Firebase Admin SDK или другого Cloud SDK, не нужно развертывать в Cloud Functions.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...