sorting - Firebase 3.0 按值排序

标签 sorting firebase firebase-realtime-database

我使用的是 firebase 3.0,我看到了 firebase 2.x 版本的示例,但它们似乎在 3.0 中不起作用。我有一个简单的结构,我希望它按值排序返回给我。

    {
  "Regions" : {
    "All" : 0,
    "Eastern & Southern Africa" : 1,
    "Global" : 6,
    "Himalayas" : 2,
    "Mekong" : 3,
    "Mesoamerica" : 5,
    "West Africa" : 4
  }
}

我使用的代码返回 json,但它不是按值排序,而是按字母顺序排序。

var config = {
    apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    authDomain: "servir-activity-database.firebaseapp.com",
    databaseURL: "https://servir-activity-database.firebaseio.com",
    storageBucket: "",
  };
  firebase.initializeApp(config);
  var theRegions;
  firebase.database().ref('Regions/').orderByChild('value').on('value', function (regions) {
      theRegions = regions.val();
      loadRegions(theRegions);
  });
  function loadRegions(which)
  {
      $.each(which, function (i, value) {
          $('#ddlRegions').append($('<option>').text(i).attr('value', value));
      });
  }

我意识到我可以在客户端进行排序,但这似乎是一件可以返回排序的简单事情,我可能错过了一些非常简单的东西。

最佳答案

这是一个非常冗长的答案,远远超出了回答问题所需的内容,但可能应该考虑:

Firebase 教给我们的人生教训之一是,将键名与数据分离通常是一个好主意。我(好几次)把自己编码到一个角落,因为我使用了我认为是静态键名的东西,结果发现它需要稍后更改。让我简单地解释一下:

例如,假设您有一个用户节点

Frank_Jones: Madagascar
Leroy_Jenkins: UBRS

假设 Frank 决定不再使用“Frank”这个名字,而是希望被称为“Puf”

在这种情况下,整个数据库中的每个节点都必须更新以引用新调用的 Puf_Jones 节点。呃。

为了避免此问题,请让 Firebase 使用 childByAutoId 生成您的节点名称,并让您的值为子节点。这是一个“随机”创建的节点名称,保证是谨慎的。

更适合您数据的 Firebase 结构是

Regions
  -Ykjoas99joksjk
     region_name: "Himalayas"
     rank: 2
  -Jlioksjnfjp987
     region_name: "Eastern & Southern Africa"
     rank: 1
  -J989j99ajskmds
     region_name: "West Africa"
     rank: 4

-Ykjoas99joksjk 等节点名称由 Firebase 创建。

如您所见,我们现在为每个区域提供了名称和排名。假设您想添加夏季平均温度:

  -Ykjoas99joksjk
     region_name: "Himalayas"
     rank: 2
     temp: 77F

这使得您的 Firebase 结构能够根据您的需求进行弹性调整。

(需要遵循一些 Swift 代码,但您会明白的)

按顺序获取区域名称

let ref = myRootRef.childByAppendingPath("Regions")

ref.queryOrderedByChild("region_name").observeEventType(
    .ChildAdded, withBlock : { snapshot in
    print(snapshot)
})

获得两个最高排名

ref.queryOrderedByChild("rank").queryLimitedToLast(2).observeEventType(
    .ChildAdded, withBlock : { snapshot in
    print(snapshot)
})

以及使用现有 Firebase 结构快速回答您的问题:

regionsRef.queryOrderedByValue().observeEventType(.ChildAdded, withBlock: { 
    snapshot in
    print(snapshot)
})

这是我的翻译,需要修正...

  firebase.database().ref('Regions').orderByValue.on('value', function (snapshot) {
      loadRegions(snapshot.val());
  });

关于sorting - Firebase 3.0 按值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488428/

相关文章:

mysql - 在MYSQL中通过一个varchar列快速排序10亿行

node.js - Firebase 的云功能 - 已验证电子邮件操作

swift - putData 方法未被执行

javascript - 在使用 Firebase 的 React-native GiftedChat 聊天应用程序中加载早期消息时遇到问题

linux - 试图了解 linux 中的排序实用程序

php - 如何根据php中的日期列对mysql结果数组进行降序排序?

ios - 从 firebase 获取数组图像

node.js - NodeJS/Firebase Promise 中的范围

javascript - 如何使用 javascript 将图像 url 从 Firebase 存储保存到实时数据库?

templates - xslt 条件增量