【问题标题】:Firebase realtime database order by child with most childrenFirebase 实时数据库按孩子最多的孩子排序
【发布时间】:2021-08-15 12:20:28
【问题描述】:

我有一个数据库,它允许用户“喜欢”帖子中给出的 cmets。

当我最初获取 cmets 时,有没有办法按照最喜欢的“最高”排序 cmets?

现在我知道我可以做到.orderByChild(),但问题是我没有“喜欢”价值的孩子。

我处理“喜欢”的方式是将用户 UID 和时间戳保存在原始评论 ID 子项中。

是否可以根据里面有最多孩子的孩子来获取 cmets?

我的数据库看起来像:

{
 "users" : {
  "$uid" : {
   "posts" : {
    "$postID" : {
     "postText" : "blah blah blah",
      "comments" : {
       "$commentID" : {
        "commentText" : "blah blah blah",
         "likes" : {
          "UID01" : "1622035190516",
          "UID02" : "1622036141955",
          "UID03" : "1622036145134",
         }
       },
       "$commentID" : {
        "commentText" : "blah 2 blah 2 blah 2",
         "likes" : {
          "UID01" : "1622036141955",
          "UID02" : "1622036145134",
         }
       }
      }
    }
   }
  }
 }
}

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    是否可以根据拥有最多的孩子来获取cmets 里面有孩子吗?

    不,您不能 sort data 基于动态计算的聚合。

    NoSQL 世界中这种情况的一个经典解决方案是维护一个计数器。最好的方法之一是使用Cloud Function:计算是通过 Admin SDK 在后端完成的,因此您可以使用安全规则保护包含喜欢数量的数据库节点,这样用户就不能修改它们的值。


    更具体地说,您应该:

    1/ 写第一个like时将计数器初始化为1。您可以按照以下方式使用 onCreate Cloud 函数:

    exports.initializeCounter = functions.database.ref('users/{uid}/posts/{postID}/comments/{commentID}/likes')
        .onCreate((snapshot, context) => {
          return snapshot.ref.parent.child('nbrOfLikes').set(1);
        });
    

    2/ 每次使用 onUpdate 云函数添加或删除点赞时更新计数器,您可以在其中计算点赞数并相应地更新计数器。以下 Cloud Function 将完成这项工作。

    exports.updateCounter = functions.database.ref('users/{uid}/posts/{postID}/comments/{commentID}/likes')
        .onUpdate((change, context) => {
            const likeObject = change.after.val();
            return change.after.ref.parent.child('nbrOfLikes').set(Object.keys(likeObject).length);
        });
    

    您也可以使用numChildren() 方法,请参阅此answer


    请注意,如果这种情况发生在您的应用中,您需要处理删除所有喜欢的情况。


    另请注意,两个(或三个)云函数可以合并为一个 onWrite 云函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 2020-05-04
      • 1970-01-01
      • 2012-08-16
      • 2019-06-19
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多