Elimina i dati di Firebase più vecchi di 2 ore

Vorrei eliminare tutti i dati più vecchi di due ore. Attualmente, sul lato client, eseguo il ciclo di tutti i dati e eseguo un’eliminazione su qualsiasi elemento precedente. Quando faccio questo, la funzione db.on (‘value’) viene invocata ogni volta che qualcosa viene cancellato. Inoltre, le cose verranno eliminate solo quando un client si connette e cosa potrebbe accadere se due client si connettono contemporaneamente?

Dove posso installare qualcosa che cancella i vecchi dati? Ho un timestamp all’interno di ogni object creato da un JavaScript Date.now ().

Firebase non supporta le query con un parametro dinamico, ad esempio “due ore fa”. Può tuttavia eseguire una query per un valore specifico, ad esempio “dopo il 14 agosto 2015, 7:27:32 AM”.

Ciò significa che puoi eseguire periodicamente uno snippet di codice per ripulire gli elementi che sono più vecchi di 2 ore in quel momento :

 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(); }); 

Come noterai, io uso child_added anziché value e I limitToLast(1) . Mentre elimino ciascun bambino, Firebase child_added un child_added per il nuovo object “last” fino a quando non ci sono più elementi dopo il punto di taglio.

Aggiornamento : se vuoi eseguire questo codice in Cloud Functions for Firebase:

 exports.deleteOldItems = functions.database.ref('/path/to/items/{pushId}') .onWrite((change, context) => { var ref = change.after.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); }); }); 

Questa funzione si triggers ogni volta che i dati sono scritti in /path/to/items , quindi i nodes figli verranno eliminati solo quando i dati vengono modificati.

Questo codice è ora disponibile anche nel repository functions-samples .

Nell’ultima versione dell’API di Firebase, ref () è cambiato in 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(); }); 

È ansible esaminare le funzioni di pianificazione di Firebase con Cron Jobs . Quel collegamento mostra come pianificare una funzione Cloud Firebase per l’esecuzione a una velocità fissa. Nella funzione Firebase pianificata è ansible utilizzare le altre risposte in questo thread per eseguire query sui vecchi dati e rimuoverli.

Ho una funzione cloud triggersta da HTTP che elimina i nodes, a seconda di quando sono stati creati e della loro data di scadenza.

Quando aggiungo un nodo al database, sono necessari due campi: timestamp per sapere quando è stato creato e durata per sapere quando l’offerta deve scadere.

inserisci la descrizione dell'immagine qui

Quindi, ho questa funzione cloud triggersta da http:

 const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); /** * @function HTTP trigger that, when triggered by a request, checks every message of the database to delete the expired ones. * @type {HttpsFunction} */ exports.removeOldMessages = functions.https.onRequest((req, res) => { const timeNow = Date.now(); const messagesRef = admin.database().ref('/messages'); messagesRef.once('value', (snapshot) => { snapshot.forEach((child) => { if ((Number(child.val()['timestamp']) + Number(child.val()['duration'])) <= timeNow) { child.ref.set(null); } }); }); return res.status(200).end(); }); 

Puoi creare un cron job che ogni X minuti fa una richiesta all'URL di quella funzione: https://cron-job.org/en/

Ma preferisco eseguire il mio script, che effettua una richiesta ogni 10 secondi:

 watch -n10 curl -X GET https://(your-zone)-(your-project-id).cloudfunctions.net/removeOldMessages