我有这样的数据:
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"]
}
正确的方法是什么?
答案 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"
。