我有以下结构。 每个用户都有自己的数据。
---+ 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();
答案 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)
算法:
然后我们只调用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());
}
}
}