Удалить базу данных старше 2 часов

17

Я хотел бы удалить любые данные старше двух часов. В настоящее время, на стороне клиента, я просматриваю все данные и запускаю удаление на любом старше. Когда я это делаю, функция db.on('value') вызывается каждый раз, когда что-то удаляется. Кроме того, вещи удаляются только при подключении клиента и что может произойти, если сразу два клиента подключатся?

Где я могу настроить то, что удаляет старые данные? У меня есть метка времени внутри каждого объекта, созданного JavaScript Date.now().

  • 0
    Вы можете использовать $interval который срабатывает в каждом заданном интервале времени в миллисекундах, установите его на 7200000, т.е. на 2 часа
  • 0
    Будет ли это все еще решением на стороне клиента? Я могу отображать только новые данные без проблем, но я бы хотел, чтобы база данных автоматически удаляла все, что старше двух часов, вместо того, чтобы вручную запускать скрипт время от времени.
Показать ещё 1 комментарий
Теги:
firebase

2 ответа

21

Firebase не поддерживает запросы с динамическим параметром, например "два часа назад". Однако он может выполнять запрос для определенного значения, например "после 14 августа 2015 года, 7:27:32 утра".

Это означает, что вы можете периодически запускать фрагмент кода для очистки элементов, которые в то время были старше 2 часов:

var ref = firebase.database().ref('/path/to/items/');
var now = Date.now();
var cutoff = now - 2 * 60 * 60 * 1000;
var old = ref.orderByChild('timestamp').endAt(cutoff).limitToLast(1);
var listener = old.on('child_added', function(snapshot) {
    snapshot.ref.remove();
});

Как вы заметите, я использую child_added вместо value, а я limitToLast(1). Когда я удаляю каждого ребенка, Firebase запускает child_added для нового "последнего" элемента, пока после точки отсечения больше нет элементов.

Обновить: если вы хотите запустить этот код в облачных функциях для Firebase:

exports.deleteOldItems = functions.database.ref('/path/to/items/{pushId}')
.onWrite(event => {
  var ref = event.data.ref.parent; // reference to the items
  var now = Date.now();
  var cutoff = now - 2 * 60 * 60 * 1000;
  var oldItemsQuery = ref.orderByChild('timestamp').endAt(cutoff);
  return oldItemsQuery.once('value', function(snapshot) {
    // create a map with all children that need to be removed
    var updates = {};
    snapshot.forEach(function(child) {
      updates[child.key] = null
    });
    // execute all updates in one go and return the result to end the function
    return ref.update(updates);
  });
});

Эта функция запускается всякий раз, когда данные записываются в /path/to/items, поэтому дочерние узлы будут удаляться только при изменении данных.

Этот код теперь также доступен в functions-samples repo.

  • 1
    В вашем примере вы извлекаете записи, сохраненные 2 часа назад или меньше. Может быть, вы должны использовать endAt вместо startAt. Но все равно спасибо за ваш ответ мне помог
  • 1
    Хороший улов! Исправлена.
Показать ещё 23 комментария
5

В последней версии Firebase API ref() изменен на ref

var ref = new Firebase('https://yours.firebaseio.com/path/to/items/');
var now = Date.now();
var cutoff = now - 2 * 60 * 60 * 1000;
var old = ref.orderByChild('timestamp').endAt(cutoff).limitToLast(1);
var listener = old.on('child_added', function(snapshot) {
    snapshot.ref.remove();
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню