当我从数据库中获取所有数据而没有任何查询时,我从数据库中获取最后一个条目(生成密钥以此方式工作)。像这样:
var ref = firebase.database().ref('myObj').limitToFirst(100);
ref.on("value", function(snap){
console.log(snap.val());
});
这样我就可以正确地获得所需的所有对象。但是,如果我添加一个查询来过滤一些数据,我就会丢失原始订单。
var ref = firebase.database().ref('myObj').orderByChild('myChild').equalTo('myproperty').limitToFirst(100);
ref.on("value", function(snap){
console.log(snap.val());
});
这样,当我不应用任何过滤器时,我没有收到最新的数据。
我该如何解决?
答案 0 :(得分:2)
我刚刚意识到这会发生什么:
.ref('myObj').orderByChild('myChild').limitToFirst(100);
是orderByChild('myChild')
按降序(从底部)读取JSON,然后limitToFirst(100)
按升序再次查询该列表("再次查询" - 我的意思是以一种比字面查询列表更有效的方式)。那么最初位于底部的内容将显示在顶部 - 您从Firebase JSON文件的底部开始获得100条记录。
您可以尝试一下(tested with AngularFire2 - 删除orderByChild('size')
以查看订购中的更改)。
恢复订单的一些方法:
您写的第一种方法就是将查询更改为LimitToLast()
其他方式:
还原管道
<div *ngFor="let item of listObservable | async | reverse">
使用AngularFre2,您可以优先考虑Rxjs功能:
this.stories = af.database.list('/myObj', {
query: {
limitToLast: 100
}
}).map((array) => array.reverse()) as FirebaseListObservable<any[]>;
或者一个有趣的,通过CSS反转的方式:
#container{
display: -webkit-flex;
display: -moz-flex;
display: -ms-flex;
display: -o-flex;
-webkit-flex-direction: column-reverse;
-moz-flex-direction: column-reverse;
-ms-flex-direction: column-reverse;
-o-flex-direction: column-reverse;
}