为了账号安全,请及时绑定邮箱和手机立即绑定

删除2小时以上的火灾数据

删除2小时以上的火灾数据

婷婷同学_ 2019-07-05 15:25:41
删除2小时以上的火灾数据我想删除两个小时以上的任何数据。目前,在客户端,我循环遍历所有数据,并在任何较旧的数据上运行DELETE。当我这样做时,每次删除某个内容时都会调用db.on(‘value’)函数。另外,只有在客户端连接时才会删除这些内容,如果两个客户端同时连接,会发生什么情况?我可以在哪里设置删除旧数据的东西?我在JavaScriptDate.Now()创建的每个对象中都有一个时间戳。
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

Firebase不支持带有动态参数的查询,例如“两小时前”。它能,会,可以但是,对特定值执行查询,例如“2015年8月14日之后,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((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);
  });});

每当数据被写入时,此函数就会触发。/path/to/items,因此,只有在修改数据时才会删除子节点。

此代码现在也可在functions-samples回购.


查看完整回答
反对 回复 2019-07-05
?
茅侃侃

TA贡献1842条经验 获得超21个赞

你可以调查用Cron作业调度Firebase函数..该链接向您展示了如何安排FireBaseCloud函数以固定的速度运行。在计划好的Firebase函数中,您可以使用此线程中的其他答案查询旧数据并删除它。


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 554 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信