我使用的是 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/