【问题标题】:Firebase Realtime Database orderBy() query does not workFirebase 实时数据库 orderBy() 查询不起作用
【发布时间】:2021-04-16 23:32:24
【问题描述】:

我有一个看起来像这样的 Firebase 实时数据库

我的浏览器扩展程序用于创建故事。每个故事(在“userStories”下)都与特定用户(authUID)相关联。 authID 是用户使用 Firebase 身份验证登录的 ID。每个故事在写入“故事”时都会收到一个由 push() 生成的密钥。

我正在尝试使用 Javascript 检索数据并以相反的顺序对其进行排序。我想显示最先创建的最后一个故事。

我的 JavaScript 代码(顺便说一句,不起作用)如下所示:

firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
{
  sendResponse({type: "result", status: "success", data: snapshot.val(), request: request})
}) 

我的问题是我的查询语句有什么问题?

在排序方面没有发生任何事情。无论我尝试orderByValue()orderByKey() 还是orderByChild() 都没有区别。

为什么结果没有排序。

编辑:

如果我将我的代码修改为以下...

      firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
      {
        let results = [];
        snapshot.forEach(function(child) {
          console.log(child.key,child.val)
          results.push({ key: child.key, value: child.val() });
          console.log(results)
         })
        sendResponse({type: "result", status: "success", data: results, request: request})
      }) 

这是控制台的输出...

如您所见,排序顺序仍在升序(这不是我想要的)。

我希望结果按降序排列。

感谢您的建议。

编辑:

通过添加行 results.reverse() 来反转数组,我得到了一些结果(不完全是我想要的结果)。有一种最后的键,但其余的都混在一起了。

      {
        let results = [];
        snapshot.forEach(function(child) {
          console.log(child.key,child.val)
          results.push({ key: child.key, value: child.val() });
          results.reverse()
          console.log(results)
         })
        sendResponse({type: "result", status: "success", data: results, request: request})
      }) 

控制台上的结果是:

编辑:

很抱歉进行了如此多的修改,但这是最后一个。我找到了一个解决方案,方法是使用扩展运算符 [...] 复制数组结果,然后将其反转。我添加了res = [...results].reverse() 行,这次我将结果按降序排序。

firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
      {
        let results = [];
        let res = [];
        snapshot.forEach(function(child) {
          console.log(child.key,child.val)
          results.push({ key: child.key, value: child.val() });
          res = [...results].reverse()
          console.log(res)
         })

        sendResponse({type: "result", status: "success", data: res, request: request})
      }) 

结果如下:

【问题讨论】:

    标签: javascript firebase sorting firebase-realtime-database


    【解决方案1】:

    JSON 中的键是无序的。因此,虽然snapshot 拥有有关结果顺序的信息,但一旦您调用snapshot.val(),该信息就会丢失。

    如果您想维护有关订单的信息,您需要使用snapshot.forEach() 来循环结果。

    例如,您可以将结果转换为键和值的数组:

    firebase.database().ref('/userStories/'+authUID).orderByKey().limitToLast(5).once('value').then(function(snapshot)
    {
      let results = [];
      snapshot.forEach(function(child) {
        results.push({ key: child.key, value: child.val() });
      });
      sendResponse({type: "result", status: "success", data: results, request: request})
    }) 
    

    【讨论】:

    • 嗨。谢谢你的建议。我修改了我的帖子以包含运行您的修改后发生的事情。不幸的是,它没有帮助。顺序仍然是升序。
    • 嗨。我在 results.push() 语句之后添加了 results.reverse() 以反转结果的顺序。
    • 哦,是的,结果将始终按升序排列。如果这是唯一的问题(而不是按随机顺序),请参阅stackoverflow.com/…
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2018-12-28
    • 2021-11-13
    • 2021-05-10
    • 2019-07-31
    相关资源
    最近更新 更多