AngularFireDatabase - 根据子对象的值总和对对象的对象进行排序
AngularFireDatabase - Sort an Object of Objects by the Sum of Values on a Child Object
我有一个 Firebase 实时数据库,如下所示:
{
"Posts": {
"k4aaluyjh5" : {
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : -1,
"uid4" : 1,
"uid5" : 1,
"uid6" : -1,
"uid7" : 1,
"uid8" : 1,
"uid9" : 1,
"uid10" : 0,
"uid11" : 1,
"uid12" : 1
}
},
"949rAWacb1" : {
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : 1
}
},
"57jrnbakh1":{
"likes": {
"uid1" : -1,
"uid2" : 1
}
}
}
}
如上面的JSON所示,用户的like
的值可以是1、0或-1。然后我使用 likes
对象下的值的总和来获得每个 post 的总点赞数。我在 likes
的安全规则上使用了 .indexOn
到 optimize queries,如下所示。
{
"rules": {
"Posts":{
".indexOn": "likes"
},
".read": "true",
".write": "true"
}
}
但是,AngularFireDatabase 数据库似乎没有一个选项可以根据每个 post 的点赞总数对 post 进行排序。我找不到办法;目标是对 post 进行排序,最喜欢的排在第一位。以下是我的.TS代码:
getListbyTop() {
this.postList= this.firebaseDb.list('Posts', query =>
query.orderByChild('likes').limitToFirst(100)
);
return this.postList
}
Firebase(和大多数 NoSQL 数据库)不支持查询中的聚合。如果您想对某个值进行排序,则该值必须存在于数据库中。因此,由于您想对喜欢的数量进行排序,因此您必须将该值存储在 JSON 中并在写喜欢时保持最新。
例如,JSON 可能如下所示:
{
"Posts": {
"k4aaluyjh5" : {
"sumOfLikes": 7,
"likesCount": 12,
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : -1,
"uid4" : 1,
"uid5" : 1,
"uid6" : -1,
"uid7" : 1,
"uid8" : 1,
"uid9" : 1,
"uid10" : 0,
"uid11" : 1,
"uid12" : 1
}
},
"949rAWacb1" : {
"sumOfLikes": 3,
"likesCount": 3,
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : 1
}
},
"57jrnbakh1":{
"sumOfLikes": 0,
"likesCount": 2,
"likes": {
"uid1" : -1,
"uid2" : 1
}
}
}
}
现在您可以对 lines/dislikes 的总和或 likes/dislikes 投射的总数进行排序,其中:
query.orderByChild('sumOfLikes')
我有一个 Firebase 实时数据库,如下所示:
{
"Posts": {
"k4aaluyjh5" : {
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : -1,
"uid4" : 1,
"uid5" : 1,
"uid6" : -1,
"uid7" : 1,
"uid8" : 1,
"uid9" : 1,
"uid10" : 0,
"uid11" : 1,
"uid12" : 1
}
},
"949rAWacb1" : {
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : 1
}
},
"57jrnbakh1":{
"likes": {
"uid1" : -1,
"uid2" : 1
}
}
}
}
如上面的JSON所示,用户的like
的值可以是1、0或-1。然后我使用 likes
对象下的值的总和来获得每个 post 的总点赞数。我在 likes
的安全规则上使用了 .indexOn
到 optimize queries,如下所示。
{
"rules": {
"Posts":{
".indexOn": "likes"
},
".read": "true",
".write": "true"
}
}
但是,AngularFireDatabase 数据库似乎没有一个选项可以根据每个 post 的点赞总数对 post 进行排序。我找不到办法;目标是对 post 进行排序,最喜欢的排在第一位。以下是我的.TS代码:
getListbyTop() {
this.postList= this.firebaseDb.list('Posts', query =>
query.orderByChild('likes').limitToFirst(100)
);
return this.postList
}
Firebase(和大多数 NoSQL 数据库)不支持查询中的聚合。如果您想对某个值进行排序,则该值必须存在于数据库中。因此,由于您想对喜欢的数量进行排序,因此您必须将该值存储在 JSON 中并在写喜欢时保持最新。
例如,JSON 可能如下所示:
{
"Posts": {
"k4aaluyjh5" : {
"sumOfLikes": 7,
"likesCount": 12,
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : -1,
"uid4" : 1,
"uid5" : 1,
"uid6" : -1,
"uid7" : 1,
"uid8" : 1,
"uid9" : 1,
"uid10" : 0,
"uid11" : 1,
"uid12" : 1
}
},
"949rAWacb1" : {
"sumOfLikes": 3,
"likesCount": 3,
"likes": {
"uid1" : 1,
"uid2" : 1,
"uid3" : 1
}
},
"57jrnbakh1":{
"sumOfLikes": 0,
"likesCount": 2,
"likes": {
"uid1" : -1,
"uid2" : 1
}
}
}
}
现在您可以对 lines/dislikes 的总和或 likes/dislikes 投射的总数进行排序,其中:
query.orderByChild('sumOfLikes')