Firebase equalTo给出旧值

时间:2017-12-12 07:12:27

标签: javascript firebase firebase-realtime-database

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

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

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

我该如何解决?

1 个答案:

答案 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;
}