我正在使用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));
});
}
我意识到我可以在客户端进行排序,但这似乎是一个简单的事情,可以返回排序,我可能错过了一些非常简单的事情。
答案 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++;
});
}