Excluir dados do Firebase com mais de 2 horas

Gostaria de excluir todos os dados que são mais antigos que duas horas. Atualmente, no lado do cliente, percorro todos os dados e executo uma exclusão em qualquer um que seja mais antigo. Quando faço isso, a function db.on (‘value’) é invocada toda vez que algo é excluído. Além disso, as coisas só serão excluídas quando um cliente se conectar e o que pode acontecer se dois clientes se conectarem de uma só vez?

Onde posso configurar algo que exclua dados antigos? Eu tenho um carimbo de hora dentro de cada object criado por um Date.now () JavaScript.

O Firebase não suporta consultas com um parâmetro dynamic, como “duas horas atrás”. No entanto, pode executar uma consulta para um valor específico, como “após 14 de agosto de 2015, 7:27:32 AM”.

Isso significa que você pode executar um snippet de código periodicamente para limpar itens com mais de 2 horas no 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(); }); 

Como você child_added eu uso child_added invés de value e limitToLast(1) . Ao excluir cada criança, o Firebase triggersrá um child_added para o novo item “último” até que não haja mais itens após o ponto de corte.

Atualização : se você deseja executar este código no 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); }); }); 

Essa function é acionada sempre que os dados são gravados em /path/to/items , portanto, os nós filhos só serão excluídos quando os dados estiverem sendo modificados.

Este código agora também está disponível no repo functions-samples .

Na versão mais recente da API do Firebase, ref () é alterado para 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(); }); 

Você pode pesquisar o agendamento de funções do Firebase com tarefas Cron . Esse link mostra como agendar uma function do Firebase Cloud para ser executada em uma taxa fixa. No Firebase Function agendado, você poderia usar as outras respostas neste thread para consultar dados antigos e removê-los.

Eu tenho uma function de nuvem acionada por http que exclui nós, dependendo de quando eles foram criados e sua data de expiração.

Quando eu adiciono um nó ao database, ele precisa de dois campos: timestamp para saber quando ele foi criado e duração para saber quando a oferta deve expirar.

insira a descrição da imagem aqui

Então, eu tenho essa function de nuvem acionada por 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(); }); 

Você pode criar uma tarefa cron que a cada X minutos faça uma solicitação para o URL dessa function: httcron : //cron-job.org/en/

Mas eu prefiro executar meu próprio script, que faz uma solicitação a cada 10 segundos:

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