首页 > 解决方案 > Firebase 实时数据库 orderBy() 查询不起作用

问题描述

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

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})
      }) 

这是控制台的输出...

Console.log 输出

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

我希望结果按降序排列。

谢谢你的建议。

编辑:

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})
      }) 

结果如下: 排序结果

标签: javascriptfirebasesortingfirebase-realtime-database

解决方案


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})
}) 

推荐阅读