2015-08-14 30 views
17

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?Cancellare i dati del firebase più vecchi di 2 ore

Dove posso impostare qualcosa che cancelli i vecchi dati? Ho un timestamp all'interno di ogni oggetto creato da un JavaScript Date.now().

+0

è possibile utilizzare '$ interval' che ottiene il fuoco in ogni determinato intervallo di tempo in millisecondi, impostarlo 7200000 cioè due ore –

+0

Questa sarebbe ancora una soluzione lato client? Posso solo visualizzare i dati più recenti senza problemi, ma mi piacerebbe che il database cancelli automaticamente tutto ciò che ha più di due ore invece di dover eseguire manualmente uno script ogni tanto. – carterw485

+0

ok, quindi utilizzare il metodo 'remove()', che elimina tutti i dati dalla posizione di Firebase. controlla [questo] (https://www.firebase.com/docs/web/api/firebase/remove.html) –

risposta

23

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

Ciò significa che è possibile eseguire un frammento di codice periodicamente per pulire 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 si noterà che uso child_added invece di value, e I limitToLast(1). Mentre elimino ogni bambino, Firebase genera un child_added per il nuovo oggetto "ultimo" fino a quando non ci sono più elementi dopo il punto di taglio.

Aggiornamento: se si desidera eseguire questo codice in funzioni cloud per 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); 
    }); 
}); 

Questa funzione attiva ogni volta che i dati vengono scritti sotto /path/to/items, in modo da nodi figlio sarà cancellato solo quando i dati vengono modificati .

Questo codice è ora disponibile anche nello functions-samples repo.

+1

Nel tuo esempio recuperi i record salvati 2 ore fa o meno. Forse dovresti usare endAt invece di startAt. Ma ancora grazie per la tua risposta mi ha aiutato – Crema

+0

Buona cattura! Fisso. –

+0

Ciao Frank, sto tentando di fare qualcosa di simile in Swift, ma non riesco a capire quale metodo stai chiamando nell'ascoltatore. Ho passato alcune ore a cercare e provare, ma ho deciso che era ora di chiedere aiuto! – Abhi

5

Nella versione più recente di API Firebase, ref() viene modificato 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(); 
}); 
Problemi correlati