Firebase 3.0按值排序

时间:2016-05-27 16:34:14

标签: 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));
      });
  }

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

2 个答案:

答案 0 :(得分:1)

这是一个非常冗长的答案,并且不仅仅是回答这个问题所需的方式,但应该考虑:

Firebase教给我们的生活经验之一是,将关键名称与数据分离通常是一个好主意。我(几次)将自己编码到一个角落,因为我使用了我认为的静态密钥名称,但发现它需要稍后更改。让我简单地阐述一下:

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

Frank_Jones: Madagascar
Leroy_Jenkins: UBRS

并且假设弗兰克决定他不再想要使用“弗兰克”这个名字,而是想要被称为“普拉”&#39;

在这种情况下,必须更新整个数据库中的每个节点,以便返回新调用的Puf_Jones节点。啊。

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

您的数据的更好的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)
})

这是我需要修复的lol翻译......

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

答案 1 :(得分:1)

谢谢@Jay,你的回答只是啰嗦!我不得不将代码部分从swift更改为javascript,但是我按照你所描述的关键方法跟随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++;
      });
  }