只保留NN最新条目并删除所有其余条目

时间:2017-05-30 11:04:40

标签: android firebase firebase-realtime-database

我有以下结构。 每个用户都有自己的数据。

---+ root_child
   |
   +---+ Gy7FXRbRjDfAKWu7a95NgiGIZUk1  (Firebase User Id)
       |
       |
       +---+ KlNlb71qtQUXIGA4cNa (random key, generated by Firebase)
       |   |
       |   +--- timestamp = 1234567890
       |   |
       |   +--- (other data field ...)
       |
       |
       +---+ KlNlcmfMTDjxQ0BwW1K
       |   |
       |   +--- timestamp = 9876543211
       |   |
       |   +--- (other data field ...)
       |
       |
       +---+ (...)

以这种方式添加记录:

databaseReference = FirebaseDatabase.getInstance().getReference("root_child");
databaseReference.child(firebaseUser.getUid())
    .push()
    .setValue(val);
  

push() ...在单个客户端上生成的位置将进行排序   它们的创建顺序......

现在,我如何只留下100个最新的条目(对于指定的用户ID)并删除所有其他条目?

伪代码:

databaseReference = FirebaseDatabase.getInstance()
    .getReference("root_child")
    .child(firebaseUser.getUid())
    .deleteLastNnRecords();

2 个答案:

答案 0 :(得分:1)

我可能会使用sort and filter functions

首先,我会使用单个值侦听器抓取子计数:https://stackoverflow.com/a/43607203/7949696,或者在云函数的情况下,我会计算写入触发器上snap的子项。

然后,如果childCount> 100,我会在OrderByChild()timestamp,然后按LimitToLast(childCount - 100)

过滤

如果我是你,我会使用cloud functions来实现这一点,并在写入root_child/${uid}/

时设置一个函数

编辑:来自评论的源代码链接: https://github.com/firebase/functions-samples/tree/master/limit-children

干杯!

编辑2:push()按时间顺序排序,因此无需OrderByChild

答案 1 :(得分:0)

算法:

  1. AddListenerForSingleValueEvent只被调用一次以获取所有数据并删除所有旧数据
  2. 然后我们只调用addChildEventListener来获取新数据

        databaseReference.orderByKey()
            .addListenerForSingleValueEvent(valueEventListener =
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            long count = dataSnapshot.getChildrenCount();
                            long deleteFirst = count - Const.FB_MAX_CHILD;
                            long i = 0;
    
                            Log.i(TAG, "DataSnapshot children count = " + String.valueOf(count));
                            for (DataSnapshot data : dataSnapshot.getChildren()) {
                                i++;
                                if (i <= deleteFirst) {
                                    // delete
                                    Log.i(TAG, "delete => " + data.getKey());
                                    data.getRef().removeValue();
                                } else {
                                    TrackData trackData = data.getValue(TrackData.class);
                                    Log.i(TAG, data.getKey() + " = " + trackData.toString());
                                }
                            }
                        }