【问题标题】:Firebase Realtime Database fast remove big query resultFirebase 实时数据库快速删除大查询结果
【发布时间】:2020-08-31 03:16:35
【问题描述】:

我的实时数据库已存储超过 1GB 的数据,因此为了修剪、节省存储空间和优化日常使用,我每月运行一次例程以删除旧的和不相关的数据。

它是这样的:

App.getDatabaseInstance().getReference("store/orders/historic/").orderByChild("creationTs").limitToLast(500).endAt(System.currentTimeMillis() - (90L * ONE_DAY_MILLIS)).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.hasChildren()) {
                    for (DataSnapshot historicDs : dataSnapshot.getChildren()) {
                          historicDs.getRef().removeValue();
                    }      
                    cleanHistoricBranch();
                } else
                    System.out.println("FINISHED!!!");
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

查询在数据库中的数千个节点(不是数百万个)上运行,但需要 HOURS 才能完成。我想问题是必须一个接一个地下载和删除数据

我尝试了不同的方法,但效果不佳。

App.getDatabaseInstance().getReference("store/orders/historic/").orderByChild("creationTs").limitToLast(500).endAt(System.currentTimeMillis() - (90L * ONE_DAY_MILLIS)).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (dataSnapshot.hasChildren()) {
                        dataSnapshot.getRef().removeValue(); //deletes the whole branch, even the nodes that doesnt match the query.     
                        cleanHistoricBranch();
                    } else
                        System.out.println("FINISHED!!!");
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                }
            });

那么有没有人有更好的方法来修剪数据库层次结构中的大量节点?每个节点的数据很少,但我有大约 20 到 5 万个候选节点要删除。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    如果大部分时间都花在读取数据上,常见的做法是:

    1. 更频繁地运行该过程,这样您每次需要做的数据更少。
    2. 设置数据库的集成备份,并使用该备份确定要脱机删除的键。然后将写入操作发送到在线数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2020-04-13
      • 2021-06-04
      相关资源
      最近更新 更多