当我从数据库中获取所有数据而没有任何查询时,我从数据库中获取最后的条目(生成密钥以这种方式工作)。像这样的东西:
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());
});
这样,当我不应用任何过滤器时,我没有收到最新的数据。
我怎么解决这个问题?
我刚刚意识到这会发生什么:
.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">
使用AngularFire2,您可以利用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;
}