Подтвердить что ты не робот

Удалить данные о бомбе более 2 часов

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

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

4b9b3361

Ответ 1

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.

Ответ 2

В последней версии 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();
});