Пакетный процесс в FireBase для удаления данных, хранящихся в течение месяца - PullRequest
0 голосов
/ 09 мая 2018

Я работаю с приложением AngularFire, и данные, которые я храню в fireBase, имеют дату создания. Я хочу стереть все данные, которые были сохранены за месяц до сегодняшней даты. Пример, если объект "x" был сохранен 9 апреля, а сегодня - 9 мая, его следует удалить автоматически, поэтому в соответствии с документацией вы можете иметь Транзакции и Пакетные записи . Можно ли выполнить то, что я хочу? или мне придется написать код на угловой стороне, и каждый раз, когда кто-то открывает приложение, проверяет дату и стирает то, что было сохранено в течение месяца. Я знаю, что для баз данных Oracle это можно сделать с помощью пакетного скрипта, поэтому я подумал, можно ли сделать это и для FireBase.

1 Ответ

0 голосов
/ 09 мая 2018

Это возможно, если вы храните даты в Firebase. Есть несколько способов сделать это, но независимо от того, что вы выберете, я бы порекомендовал вам сделать это вне клиента . Это не очень хорошая идея, чтобы удалить то, что потенциально много данных на стороне клиента. Вы можете настроить работу cron с сервера, которым вы управляете. Вы периодически запускаете задание и используете Admin SDK для доступа и удаления данных.

У вас есть запрос к документам, как в следующем примере:

let query = ref.collection('collectionname').where('timestamp', '<', {variable with the time frame goes here})

Затем вы можете использовать пакетное удаление, как показано в разделе удалить данные документов .

function deleteCollection(db, collectionPath, batchSize) {
  var collectionRef = db.collection(collectionPath);
  var query = collectionRef.where('timestamp', '<', {variable with the time frame goes here});

  return new Promise((resolve, reject) => {
    deleteQueryBatch(db, query, batchSize, resolve, reject);
  });
}

function deleteQueryBatch(db, query, batchSize, resolve, reject) {
  query.get()
      .then((snapshot) => {
        // When there are no documents left, we are done
        if (snapshot.size == 0) {
          return 0;
        }

        // Delete documents in a batch
        var batch = db.batch();
        snapshot.docs.forEach((doc) => {
          batch.delete(doc.ref);
        });

        return batch.commit().then(() => {
          return snapshot.size;
        });
      }).then((numDeleted) => {
        if (numDeleted === 0) {
          resolve();
          return;
        }

        // Recurse on the next process tick, to avoid
        // exploding the stack.
        process.nextTick(() => {
          deleteQueryBatch(db, query, batchSize, resolve, reject);
        });
      })
      .catch(reject);
}

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

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