Quiero eliminar los datos de más de 15 días. ¿Puedo consultar y eliminar varios directorios al mismo tiempo?
La estructura de la base de datos es así. Hay varios idiomas y tipos.
{ "hr" : { "classic" : { "finish" : { "-MuJD4oAlQ42TkdfKW5M" : { "gid" : "LlAHMyj", "ts" : 6.652890289073215E8 } } }, "duel" : { "finish" : { "-MuJD4o9LONeayt4ACMC" : { "gid" : "rfePU2x", "ts" : 6.652890289073215E8 } } }, "target" : { "finish" : { "-MuJD4o9LONeayt4ACMD" : { "gid" : "FBz4H_4", "ts" : 6.652890289073215E8 } } } }, "nl" : { "target" : { "finish" : { "-MuJD4oAlQ42TkdfKW5L" : { "gid" : "sv3pRfC", "ts" : 6.652890289073215E8 } } } } }Intenté hacerlo con el siguiente código, pero siempre devuelve nulo.
exports.deleteOldData = function (snap, context) { const end = new Date(new Date().setDate(new Date().getDate() - 15)); const endDate = toSwiftDate(end); database.ref("/matchTour/{language}/{type}/finish/").orderByChild("ts").endAt(endDate).transaction(function (info) { if (info === null) return info; console.log("matchTour 3", JSON.stringify(info.val())); return null; }).catch((error) => { console.log("error); }); };No puede ejecutar una transacción en una consulta. De hecho, al mirar la documentación de referencia para Query , esto ni siquiera debería compilarse.
Esto debería estar más cerca:
exports.deleteOldData = function (snap, context) { const end = new Date(new Date().setDate(new Date().getDate() - 15)); const endDate = toSwiftDate(end); const ref = database.ref("/matchTour/{language}/{type}/finish/"); return ref .orderByChild("ts").endAt(endDate) .once("value") .then((results) => { let updates = {}; results.forEach((snapshot) => { updates[snapshot.key] = null; }); return ref.update(updates); }).catch((error) => { console.error(error); }); };Lo anterior lee los resultados de la consulta de los datos, realiza una única actualización de varias rutas para eliminarlos todos y garantiza que las promesas devueltas por la burbuja de lectura y escritura asincrónica, para que su contenedor de funciones no se termine prematuramente
Eso deja la pregunta de qué language y type están en database.ref("/matchTour/{language}/{type}/finish/") . Si se supone que hay variables que provienen del contexto, querrá usar acentos graves para esta cadena:
database.ref(`/matchTour/{language}/{type}/finish/`)En general, hay bastantes errores en este código que me hacen pensar que es posible que aún no se sienta muy cómodo escribiendo JavaScript del lado del servidor. Si ese es el caso, escribir Cloud Functions no es la forma más fácil de comenzar, y recomiendo primero escribir el mismo código en un entorno de JavaScript del lado del cliente, como un script local de node.js o incluso una página web.
Leer la documentación de Firebase para desarrolladores web y/o realizar el Codelab de Firebase para desarrolladores web son excelentes puntos de partida.