繁体   English   中英

如何使用 Javascript 中的查询对 Firebase 实时数据库进行排序/过滤

[英]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数量最多的用户)”。

当我打印到控制台时,我希望看到来自User3User6的数据,因为它们的球体数量最多......但它似乎是按用户名( User5User6 )排序或根本不排序全部。 这是日志 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM