【问题标题】:AngularFireDatabase - Sort an Object of Objects by the Sum of Values on a Child ObjectAngularFireDatabase - 按子对象上的值总和对对象对象进行排序
【发布时间】:2020-12-09 22:34:04
【问题描述】:

我有一个如下所示的 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 对象下的值的总和来获得每个帖子的总点赞数。我在安全规则上使用了.indexOnoptimize querieslikes,如下所示。

{
  "rules": {
    "Posts":{
      ".indexOn": "likes"
    },
    ".read": "true",
    ".write": "true"
  }
}

但是,AngularFireDatabase base 似乎没有按每个帖子的喜欢总和对帖子进行排序的选项。我找不到办法。目标是对帖子进行排序,最喜欢的帖子排在第一位。以下是我的.TS代码:

 getListbyTop() {
    this.postList= this.firebaseDb.list('Posts', query =>
      query.orderByChild('likes').limitToFirst(100)
    );
    return this.postList
  }

【问题讨论】:

    标签: javascript firebase-realtime-database angularfire2


    【解决方案1】:

    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
          }
        }
      }
    }
    

    现在您可以根据行/不喜欢的总和或喜欢/不喜欢的总数进行排序,使用:

    query.orderByChild('sumOfLikes')
    

    【讨论】:

    • 成功了!但是当我投新的喜欢时,项目的顺序会重新排列。这是另一个代码:this.imgService.getListbyTop().snapshotChanges().subscribe( list => { this.imageList = list.map(item => {return item.payload.val()}).reverse(); })
    • 可能是什么问题?
    • 在这种情况下,您似乎没有正确更新 sumOfLikeslikesCount。如果您无法使其正常工作,请通过minimal code that reproduces the problem 发布一个新问题。
    猜你喜欢
    • 2012-12-24
    • 2018-06-22
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多