2017-05-30 33 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()); 
              } 
             } 
            } 
    
相關問題