Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase实时数据库按子级排序,子级最多_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase实时数据库按子级排序,子级最多

Javascript Firebase实时数据库按子级排序,子级最多,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我有一个数据库,允许用户“喜欢”帖子上的评论 当我最初获取评论时,有没有一种方法可以先按“最高”排序 现在我知道我可以做.orderByChild(),但问题是我没有一个“like”值的孩子 我处理“likes”的方法是将用户UID和时间戳保存在原始commentID子级中 是否可以根据包含最多子项的子项获取注释 我的数据库看起来像: { "users" : { "$uid" : { "posts" : { &quo

我有一个数据库,允许用户“喜欢”帖子上的评论

当我最初获取评论时,有没有一种方法可以先按“最高”排序

现在我知道我可以做
.orderByChild()
,但问题是我没有一个“like”值的孩子

我处理“likes”的方法是将用户UID和时间戳保存在原始commentID子级中

是否可以根据包含最多子项的子项获取注释

我的数据库看起来像:

{
 "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",
         }
       }
      }
    }
   }
  }
 }
}
是否有可能获取基于具有最多属性的子级的注释 里面有孩子吗

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

NoSQL世界中这种情况的一个经典解决方案是维护一个计数器。实现这一点的最佳方法之一是使用:计算是在后端通过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函数添加或删除like时更新计数器,在该函数中计算like的nbr,并相应地更新计数器。下面的云函数将完成这项工作

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()
方法,请参见此


请注意,如果此情况发生在您的应用程序中,您需要处理删除所有“喜欢”的情况


还请注意,两个(或三个)云函数可以合并到一个onWrite云函数中