【问题标题】:Batch process in firebase to delete data stored for a monthFirebase中的批处理以删除存储一个月的数据
【发布时间】:2018-10-19 19:37:47
【问题描述】:

我正在使用 AngularFire 应用程序,我存储在 fireBase 中的数据有一个创建日期。我想删除从一个月到今天为止存储的所有数据。例如,如果“x”对象存储在 4 月 9 日,而今天是 5 月 9 日,它应该会自动删除,因此根据文档,您可以拥有 Transactions and Batched Writes。有没有可能完成我想要的?否则我将不得不在 Angular 端编写代码,并且每次有人打开应用程序时都会检查日期并删除已存储一个月的内容。我知道对于 Oracle 数据库,这可以通过批处理脚本来完成,所以我在想是否也可以为 FireBase 完成。

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    如果您将日期存储在 Firebase 中,这是可能的。有几种方法可以做到这一点,但无论您选择哪种方式,我都建议您在客户端之外进行。删除客户端潜在的大量数据并不是一个好主意。您可以从您控制的服务器设置 cron 作业。您定期运行作业并使用Admin SDK 访问和删除数据。

    你会有一些针对文档的查询,比如这个例子:

    let query = ref.collection('collectionname').where('timestamp', '<', {variable with the time frame goes here})
    

    然后可以使用批量删除,如delete data section of the docs所示。

    function deleteCollection(db, collectionPath, batchSize) {
      var collectionRef = db.collection(collectionPath);
      var query = collectionRef.where('timestamp', '<', {variable with the time frame goes here});
    
      return new Promise((resolve, reject) => {
        deleteQueryBatch(db, query, batchSize, resolve, reject);
      });
    }
    
    function deleteQueryBatch(db, query, batchSize, resolve, reject) {
      query.get()
          .then((snapshot) => {
            // When there are no documents left, we are done
            if (snapshot.size == 0) {
              return 0;
            }
    
            // Delete documents in a batch
            var batch = db.batch();
            snapshot.docs.forEach((doc) => {
              batch.delete(doc.ref);
            });
    
            return batch.commit().then(() => {
              return snapshot.size;
            });
          }).then((numDeleted) => {
            if (numDeleted === 0) {
              resolve();
              return;
            }
    
            // Recurse on the next process tick, to avoid
            // exploding the stack.
            process.nextTick(() => {
              deleteQueryBatch(db, query, batchSize, resolve, reject);
            });
          })
          .catch(reject);
    }
    

    这只是一个一般示例,因此您必须根据您的数据结构和需求对其进行自定义,但它概述了这个想法。您可以在我上面包含的链接中查看更多信息。

    【讨论】:

    • 哇!我认为这是不可能的,“cron”这个词正是我错过的一个词(忘记用英语怎么说,哈哈)在我查看文档之前我唯一的问题是:你说将日期存储在firebase中......我将它们放在firebase集合{ "name":"John", "age":30, "cars":[ "Ford", "BMW", "Fiat" ], "creationDate" : "05/09/2018" }内的每个对象中,可以吗?还是您打算以不同的方式存储它?
    • 你是如何格式化你的日期的?如果它是一个字符串,那么它不会按日期排序,而是按字符串本身排序,这不会给你想要的结果。我很确定只要你在做 YYYY/MM/DD,你仍然可以使字符串工作。
    • 这是一个新项目,现在有 3 个对象。如果您认为将其存储为日期会更好,那么我会这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多