我正在尝试使用orderByChild()
在Firebase中按时间戳排序,但它不起作用。结果似乎是按键排序的,Firebase似乎忽略了orderByChild()
。
从时间上可以看出,这些结果不按时间戳排序。
lorem-ipsum-dolor-si - 2016年6月17日拉斯维加斯8:51:33
lorem-ipsum-dolor-si193 - 2016年6月17日拉斯维加斯8:51:37
lorem-ipsum-dolor-si297 - 2016年6月17日拉斯维加斯8:51:43
lorem-ipsum-dolor-si402 - 2016年6月17日拉斯维加斯8:51:38
这就是我获取数据的方式:
let endpoint = 'texts/-KKPSjKwelbXG6Rq8AEh/-KKQqtg_a95p4Gm13XgZ'
firebase.database().ref(endpoint).orderByChild('timestamp').on('value',...)
由于snapshot.val()
将按键排序,而不是按orderByChild()
顺序排序,因此我必须将排序的快照存储在数组中并将其发送回视图。
this.data = []
snapshot.forEach(function(child) {
this.data.push(child.val())
}.bind(this))
return this.data
时间戳来自Date.now()
。我已尝试将其存储为Number
或String
,结果相同。
正如您所见,它在Firebase中存储得很好:
{
"-KKPSjKwelbXG6Rq8AEh" : {
"-KKQqtg_a95p4Gm13XgZ" : {
"lorem-ipsum-dolor-si" : {
"body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
"timestamp" : 1466171493149
},
"lorem-ipsum-dolor-si193" : {
"body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
"timestamp" : 1466171497193
},
"lorem-ipsum-dolor-si297" : {
"body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
"timestamp" : 1466171503297
},
"lorem-ipsum-dolor-si402" : {
"body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
"timestamp" : 1466171498402
}
}
}
}
我错过了什么?
编辑:
问题在于我正在创建引用并稍后添加orderByChild()
。
let ref = firebase.database().ref(endpoint)
...
ref.orderByChild('timestamp')
...
ref.on('value',onChange)
我这样做是因为我有一个类动态地创建对Firebase的这些调用。
答案 0 :(得分:8)
适合我:
firebase.database().ref(endpoint)
.orderByChild('timestamp')
.on('value', function(snapshot) {
this.data = [];
snapshot.forEach(function(child) {
this.data.push(child.val());
}.bind(this));
console.log("all", data.map(function(val) { return new Date(val.timestamp).toString(); }));
});
“所有”
[“Fri Jun 17 2016 06:51:33 GMT-0700(PDT)”,“Fri Jun 17 2016 06:51:37 GMT-0700(PDT)”,“Fri Jun 17 2016 06:51:38 GMT-0700(PDT)“,”Fri Jun 17 2016 06:51:43 GMT-0700(PDT)“] 块引用
firebase.database().ref(endpoint)
.orderByChild('timestamp')
.startAt(1466171497190)
.endAt(1466171498405)
.on('value', function(snapshot) {
this.data = [];
snapshot.forEach(function(child) {
this.data.push(child.val());
}.bind(this));
console.log("filtered", data.map(function(val) { return new Date(val.timestamp).toString(); }));
});
“过滤”
[“Fri Jun 17 2016 06:51:37 GMT-0700(PDT)”,“Fri Jun 17 2016 06:51:38 GMT-0700(PDT)”]