【问题标题】:Firebase 3.0 sort by valueFirebase 3.0 按值排序
【发布时间】:2016-05-29 00:53:30
【问题描述】:

我使用的是 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));
      });
  }

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

【问题讨论】:

  • 这可能是一个问题orderByChild('value'),因为您没有任何具有“value”键的子节点。您的子节点是“All”、“Global”、“Mekong”等。您还可以删除 Regions/ 中无关的斜线。另外......这只是一个想法,您应该将您的键名与数据分离。键可能由带有子 /location 和 /count 的 autoId 生成。然后您可以轻松地按位置或计数进行查询和排序。
  • 感谢杰。我不确定我是否完全理解。我试图做的是按与键关联的值排序。所以他们会回来“全部”:0,“东部和南部非洲”:1,“喜马拉雅山”:2,而不是按字母顺序。我已经为每个键分配了正确顺序的值。能否请您多解释一下您的方法,以便我调整思路?
  • 3.0 在这方面没有任何改变。如果要按值排序,请在回调中调用ref.child("path/to/child").orderByValue(),然后调用snapshot.forEach(function(child) ...

标签: sorting firebase firebase-realtime-database


【解决方案1】:

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

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

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

Frank_Jones: Madagascar
Leroy_Jenkins: UBRS

假设弗兰克决定不再使用“弗兰克”这个名字,而是想被称为“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)
})

以及 Swift 对您现有 Firebase 结构的问题的回答:

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

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

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

【讨论】:

    【解决方案2】:

    谢谢@Jay,你的回答已经够啰嗦了!我不得不将代码部分从 swift 更改为 javascript,但我按照你描述的 key 方法使用了 autoid。这是我用来处理返回数据的js。

      firebase.database().ref('Regions').orderByChild("rank").on('child_added', function (regions) {
          loadRegions(regions.exportVal());
      });
    
      firebase.database().ref('Regions').orderByChild("rank").on('child_removed', function (regions) {
          removeRegion(regions.exportVal());
      });
      function removeRegion(which)
      {
          $("#ddlRegions option[value="+which.rank+"]").remove();
      }
      function loadRegions(which)
      {
          var count = 0;
          var RegionValue;
          $.each(which, function (i, value) {
              if (count % 2 == 0) {
                  RegionValue = value;
              }
              else {
                  $('#ddlRegions').append($('<option>').text(value).attr('value', RegionValue));
              }
              count++;
          });
      }  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2018-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      相关资源
      最近更新 更多