首页 > 解决方案 > Firebase 实时数据库快速删除大查询结果

问题描述

我的实时数据库已经存储了超过 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 万个候选节点要删除。

标签: androidfirebasefirebase-realtime-database

解决方案


如果时间主要花在读取数据上,常见的做法是:

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

推荐阅读