2017-05-30 48 views
0

我有以下结构。 每个用户都有自己的数据。只留下NN最新的条目,并删除所有其余的

---+ 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(); 

回答

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

谢谢。看起来像这是我需要https://github.com/firebase/functions-samples/tree/master/limit-children – tim4dev

0

算法:

  1. AddListenerForSingleValueEvent被称为只有1次获得的所有数据,并删除所有旧的
  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()); 
              } 
             } 
            } 
    
相关问题