firebase - 如何在 Firebase 中按子值排序
问题描述
我有这样的数据:
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"]
}
正确的方法是什么?
解决方案
您的代码是正确的,应该显示所需的结果。
'child_added'
由于“侦听器传递了一个包含新孩子数据的快照”,因此您可能会因为该事件而难以查看结果,如文档中所述。
您可以使用以下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"
因为只有一个参数。
推荐阅读
- css - 考虑到网格布局中第一行的高度,我可以有一个全高的第二行吗?
- r - 如何将回归线添加到散点图
- python - 无法在 asyncio 中安排任何内容。(Python 3.7.x)
- git - 如何在 Visual Studio 中对 2 个不同的文件进行版本控制
- java - 弹簧靴休息日减量
- azure - 无法更改 Azure 帐户注册的付款信息中的“地区/国家”
- typescript - 在打字稿的分隔文件中实现方法类
- java - 如何以编程方式重命名包和类?
- azure-devops - 我可以在我的 Azure 管道中使用 2 个代理池吗?
- php - 在 laravel 8 中运行时,多态关系给出一个空白页