Javascript 删除早于2小时的firebase数据

Javascript 删除早于2小时的firebase数据,javascript,angularjs,firebase,firebase-realtime-database,Javascript,Angularjs,Firebase,Firebase Realtime Database,我想删除超过两小时的数据。目前,在客户端,我循环遍历所有数据,并对过时的数据执行删除操作。执行此操作时,每次删除某个内容时都会调用db.on('value')函数。此外,只有当一个客户端连接时才会删除内容,如果两个客户端同时连接,会发生什么情况 在哪里可以设置删除旧数据的内容?我在JavaScriptDate创建的每个对象中都有一个时间戳。now()Firebase不支持带有动态参数的查询,例如“两小时前”。但是,它可以执行特定值的查询,例如“2015年8月14日之后,上午7:27:32” 这意

我想删除超过两小时的数据。目前,在客户端,我循环遍历所有数据,并对过时的数据执行删除操作。执行此操作时,每次删除某个内容时都会调用
db.on('value')
函数。此外,只有当一个客户端连接时才会删除内容,如果两个客户端同时连接,会发生什么情况


在哪里可以设置删除旧数据的内容?我在JavaScript
Date创建的每个对象中都有一个时间戳。now()

Firebase不支持带有动态参数的查询,例如“两小时前”。但是,它可以执行特定值的查询,例如“2015年8月14日之后,上午7:27:32”

这意味着您可以定期运行一段代码,以清理当时超过2小时的项目:

正如您所注意到的,我使用
child\u added
而不是
value
,并且我使用
limitToLast(1)
。当我删除每个子项时,Firebase将为新的“最后一个”项触发一个
child\u 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
下写入数据时,就会触发此函数,因此只有在修改数据时才会删除子节点


此代码现在也可以在中找到。

在最新版本的Firebase API中,ref()更改为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();
});

你可以调查一下。该链接向您展示了如何安排Firebase云函数以固定速率运行。在计划的Firebase函数中,您可以使用此线程中的其他答案来查询旧数据并将其删除。

我有一个http触发的云函数,它可以删除节点,具体取决于节点的创建时间和过期日期

当我向数据库中添加节点时,它需要两个字段:timestamp来知道它是何时创建的,以及duration来知道报价必须在何时过期

然后,我有一个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();
});

如果有人会有同样的问题,但在Firestore中。我编写了一个小脚本,首先将文档读取到console.log,然后从超过24小时的邮件集合中删除文档。每24小时更新一次网站,就这样。代码如下

var yesterday = firebase.firestore.Timestamp.now();
  yesterday.seconds = yesterday.seconds - (24 * 60 * 60);
  console.log("Test");
  db.collection("messages").where("date",">",yesterday)
      .get().then(function(querySnapshote) {
        querySnapshote.forEach(function(doc) {
          console.log(doc.id," => ",doc.data());
        });
      })
  .catch(function(error) {
        console.log("Error getting documents: ", error);
  });

  db.collection("messages").where("date","<",yesterday)
    .get().then(function(querySnapshote) {
      querySnapshote.forEach(element => {
        element.ref.delete();
      });
    })
var昨天=firebase.firestore.Timestamp.now();
昨天.seconds=昨天.seconds-(24*60*60);
控制台日志(“测试”);
db.集合(“消息”)。其中(“日期”,“昨天”)
.get().then(函数(querySnapshote){
querySnapshote.forEach(函数(文档){
console.log(doc.id,=>,doc.data());
});
})
.catch(函数(错误){
log(“获取文档时出错:”,错误);
});

db.集合(“消息”)。其中(“日期”,"您可以使用
$interval
在每个给定的时间间隔内以毫秒为单位触发,将其设置为7200000,即2小时。这仍然是客户端解决方案吗?我只能毫无问题地显示较新的数据,但我想让数据库自动删除超过两小时的所有内容,而不是手动运行数据库不时编写脚本。确定,然后使用
remove()
method,该方法删除firebase位置的所有数据。检查我看到firebase中现在有计划的函数:在您的示例中,您获取2小时或更短时间前保存的记录。也许您应该使用endAt而不是startAt。但仍然感谢您的回答,它帮助meGood捕获了!修复了。嗨,Frank,我正在尝试做类似的事情然而,在Swift中,我似乎无法弄清楚您在侦听器中调用的是什么方法。我花了几个小时搜索和尝试,但决定是时候寻求帮助了!当我实现此功能时,所有数据都在1秒后而不是2小时后被删除。我复制并粘贴了正确的代码,所以我不知道发生了什么事?请注意上传的所有人iOS的时间戳:timeIntervalSince1970以秒和日期为单位。现在()是毫秒,所以请确保根据需要转换我需要在swift 4中解决,知道吗!时间戳是长数字(在firebase上)还是时间戳类型?感谢cron作业!Life saver!cronjob是免费的?
watch -n10 curl -X GET https://(your-zone)-(your-project-id).cloudfunctions.net/removeOldMessages
var yesterday = firebase.firestore.Timestamp.now();
  yesterday.seconds = yesterday.seconds - (24 * 60 * 60);
  console.log("Test");
  db.collection("messages").where("date",">",yesterday)
      .get().then(function(querySnapshote) {
        querySnapshote.forEach(function(doc) {
          console.log(doc.id," => ",doc.data());
        });
      })
  .catch(function(error) {
        console.log("Error getting documents: ", error);
  });

  db.collection("messages").where("date","<",yesterday)
    .get().then(function(querySnapshote) {
      querySnapshote.forEach(element => {
        element.ref.delete();
      });
    })