![](/img/trans.png)
[英]How to Sort and Filter Firebase Realtime Database with Cloud Functions, Node.js & Javascript for 'High Score' Leaderboard
[英]How to Sort/Filter Firebase Realtime Database with Query in Javascript
我很难理解为什么这个简单的查询没有给我预期的结果。
在我的 Firebase 实时数据库中,我的结构如下所示:
很简单,对吧? 接下来,我有一个云 function,只要我手动更改任何用户下的一个orbs
值,它就会运行。 这是我的 function:
exports.testTopPlayers2 = functions.database.ref('/TestUsers/{user}/Statistics').onUpdate(_ => {
const allPlayersRef = admin.database().ref('/TestUsers');
const query = allPlayersRef.orderByChild('orbs').limitToLast(2)
return query.on('value', (snap, context) => {
return console.log(snap.val());
})
我认为也非常简单。 用普通英语,我期望 function 做的是:“当任何orbs
值发生变化时,运行此 function 以按所有用户的球体值(从最低到最高)对所有用户进行排序,并获取新的 DataSnapshot最后2个用户的数据(orbs数量最多的用户)”。
当我打印到控制台时,我希望看到来自User3
和User6
的数据,因为它们的球体数量最多......但它似乎是按用户名( User5
和User6
)排序或根本不排序全部。 这是日志 output:
这显然没有按照我在查询中定义的内容进行排序。
也许我错过了一些明显的东西,但我已经盯着它看了足够长的时间......希望有人能在我的 function 中发现关于它是如何排序的错误。
感谢您的帮助!
您正在寻找:
allPlayersRef.orderByChild('Statistics/orbs').limitToLast(2)
请注意,您还需要使用once()
而不是on()
:
return query.once('value').then((snap) => {
return snap.val();
})
您还需要删除snap.val()
周围的console.log
,因为console.log()
不返回任何内容。
最后:当您在快照上调用.val()
时,会将其转换为键值对并丢失排序信息。 如果你想保持顺序,你会想使用forEach
:
return query.once('value').then((snap) => {
let results = [];
snap.forEach((player) => {
results.push( {key: snap.key, ...snap.val() }
});
return results;
})
感谢弗兰克的彻底回答,我能够理解需要发生什么,并通过细微的调整让它完美地工作。
通过 Frank 建议的确切修改,我在 Firebase 控制台中的 output 看起来像这样:
这比我迄今为止能够制作的要好得多,但它仍然没有显示我想要使用的确切数据。 我对snap
的键(即顶级TestUsers
节点)不感兴趣,但我想要提供负责高分的用户名的player
键。
接下来,我不需要为球体值获取 [object],而是需要球体的实际值,因此我必须深入研究每个player
object 的子代以获取该值。
这是我调整后的云 function,它的荣耀大声笑:
exports.testTopPlayers2 = functions.database.ref('/TestUsers/{user}/Statistics').onUpdate(_ => {
const allPlayersRef = admin.database().ref('/TestUsers');
const query = allPlayersRef.orderByChild('/Statistics/orbs').limitToLast(2)
return query.once('value').then((snap) => {
let results = [];
snap.forEach((player) => {
let username = player.key
let orbsValue = player.child("Statistics").child("orbs").val()
results.push( {Player: username, Score: orbsValue } )
});
console.log(results)
return results;
})
})
Firebase 日志的结果是这样的:
这正是我所追求的,现在可以继续:D
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.