只留下NN最新的条目,并删除所有其余的
问题描述:
我有以下结构。 每个用户都有自己的数据。只留下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();
答
我可能会使用sort and filter functions。
首先,我会抓住孩子们用一个值听众数:https://*.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
答
算法:
- AddListenerForSingleValueEvent被称为只有1次获得的所有数据,并删除所有旧的
-
然后我们只调用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()); } } }
谢谢。看起来像这是我需要https://github.com/firebase/functions-samples/tree/master/limit-children – tim4dev