【问题标题】:Leave only NN newest entries and delete all the rest仅保留 NN 个最新条目并删除所有其余条目
【发布时间】:2017-06-09 19:14:20
【问题描述】:

我有以下结构。 每个用户都有自己的数据。

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    我可能会使用sort and filter functions

    首先,我将使用单值侦听器获取子项计数:https://stackoverflow.com/a/43607203/7949696,或者在云函数的情况下,我将在写入触发器上计算来自 snap 的子项。

    然后,如果 childCount > 100,我会在您的 timestamp 上使用 OrderByChild(),然后按 LimitToLast(childCount - 100) 过滤

    如果我是你,我会使用cloud functions 来实现这一点并设置一个函数写入root_child/${uid}/


    编辑:来自 cmets 的源代码链接: https://github.com/firebase/functions-samples/tree/master/limit-children

    干杯!


    编辑2:看起来push()是按时间顺序排列的,所以不需要OrderByChild

    【讨论】:

    【解决方案2】:

    算法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2012-11-23
      • 2020-07-05
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多