Я хотел бы удалить любые данные старше двух часов. В настоящее время, на стороне клиента, я просматриваю все данные и запускаю удаление на любом старше. Когда я это делаю, функция db.on('value') вызывается каждый раз, когда что-то удаляется. Кроме того, вещи удаляются только при подключении клиента и что может произойти, если сразу два клиента подключатся?
Где я могу настроить то, что удаляет старые данные? У меня есть метка времени внутри каждого объекта, созданного JavaScript Date.now().
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.
В последней версии 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();
});
$interval
который срабатывает в каждом заданном интервале времени в миллисекундах, установите его на 7200000, т.е. на 2 часа