如何在Firebase中按子值排序

时间:2018-08-02 13:49:10

标签: firebase firebase-realtime-database

我有这样的数据:

scores: {
  uid1: {
    score: 15,
    displayName: "Uciska"
  },
  uid2: {
    score: 3,
    displayName: "Bob"
  },
  uid3: {
    etc...
  }
}

我想按分数对它们进行排名,并且只保留前100名。

我是通过遵循文档来做到这一点的。但这行不通。即使分数改变,它也总是返回相同的顺序。

const query = firebase.database().ref('scores')
  .orderByChild('score')
  .limitToLast(100)

  query.on('child_added', snapshot => {
    const score = snapshot.val().score
    console.log(score)
})

我在规则优化中也添加了此内容,但我不确定它是否正确:

"scores": {
  ".indexOn": ["score"]
}

正确的方法是什么?

1 个答案:

答案 0 :(得分:3)

您的代码是正确的,应显示期望的结果。

由于'child_added'事件的出现,您可能会遇到困难,因为“听众被传递了包含新孩子数据的快照”,如文档中的here所述。

您可以按如下方式使用once()方法,由于它将显示整个分数集,因此可以使结果更加清晰。

    const query = firebase.database().ref('scores')
        .orderByChild('score')
        .limitToLast(100)

    query.once('value', function (snapshot) {
        snapshot.forEach(function (childSnapshot) {
            var childKey = childSnapshot.key;
            var childData = childSnapshot.val();
            console.log(childData);
            // ...
        });
    });

此外,由于只有一个参数,因此您的规则可以写为".indexOn": "score"