2017-05-30 18 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()が...場所は それらが作成された順序でソートされます単一のクライアント上で生成

ここで、(指定されたユーザーIDの)最新のエントリを100個残して残りのすべてを削除するにはどうすればよいですか?

擬似コード:

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

答えて

1

私はおそらくsort and filter functionsを使用します。

まず、1つの値リスナーで子カウントを取得します。https://stackoverflow.com/a/43607203/7949696または、クラウド機能の場合は、書き込みトリガーでsnapの子をカウントします。

その後、私があなただったらchildCount> 100ならば、私は、あなたのtimestampとのOrderByChild()が、私はこれを達成するためにcloud functionsを使用することになり、LimitToLast(childCount - 100)

でフィルタリングうと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()); 
              } 
             } 
            } 
    
関連する問題