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 的安全规则上使用了 .indexOnoptimize 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')