Firebase equalTo给出旧值

问题描述 投票:3回答:1

当我从数据库中获取所有数据而没有任何查询时,我从数据库中获取最后的条目(生成密钥以这种方式工作)。像这样的东西:

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());
});

这样,当我不应用任何过滤器时,我没有收到最新的数据。

我怎么解决这个问题?

javascript firebase firebase-realtime-database
1个回答
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">

使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.