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云函数中