firebase - >日期顺序反转

时间:2017-06-08 18:11:19

标签: javascript firebase firebase-realtime-database

我目前正在使用Firebase制作应用。

这是可以在网络上任何地方看到的公告牌之一。

但是有一个问题。

这是日期排序的问题。

我想先看一下最近的日期,但我总是只看到我先创建的数据。

postRef.orderByChild('createData').startAt(reverseDate).limitToFirst(1).on('child_added',(data)=>{
    console.log(data.val().name + data.val().createData);
})

结果 - > hello1496941142093

我的火力树enter image description here

我的代码与上面相同。

如何先查看我最近的帖子?

如何订购firebase数据库的反转?

7 个答案:

答案 0 :(得分:16)

Firebase数据库将始终按升序返回结果。没有办法扭转它们。

有两种常见的解决方法:

  1. 让数据库进行过滤,然后反转客户端的结果。
  2. 向数据库添加反转值,并将其用于查询。
  3. 这些选项之前已被覆盖过很多次。因此,我不会重复,而是列出以前的答案:

答案 1 :(得分:2)

您可以简单地创建一个函数来反转对象,然后遍历它。

function reverseObject(object) {
    var newObject = {};
    var keys = [];

    for (var key in object) {
        keys.push(key);
    }

    for (var i = keys.length - 1; i >= 0; i--) {
        var value = object[keys[i]];
        newObject[keys[i]]= value;
    }       

    return newObject;
}

答案 2 :(得分:0)

这是我解决它的方式: 首先,我在我的服务中进行了一个查询,我按毫秒过滤日期:

 getImages (): Observable<Image[]> {
this.imageCollection = this.asf.collection<Image>('/images', ref => ref.orderBy('time').startAt(1528445969388).endAt(9999999999999));
this.images = this.imageCollection.snapshotChanges().pipe(
  map(actions => actions.map(a => {
    const data = a.payload.doc.data() as Image;
    const id = a.payload.doc.id;
    return { id, ...data };
  }))
);
return this.images;

}

然后,为了获得最新的日期,我将其添加到我的组件中,我从我的服务中调用该方法:

let date = new Date;
let time = 9999999999999 - date.getTime();
console.log(time);

我把时间作为日期传递。由于较新的日期将是从9999999999999中扣除的较大数字,因此我的服务中的最新日期将首先出现在我的查询中。

希望这能为你解决这个问题

答案 3 :(得分:0)

我已经结束更改在前端部分上创建列表的方式。

posts.add(post);

更改为

posts.insert(0, post);

答案 4 :(得分:0)

您可以使用一种方法,将相同或替代的子项保存为负值,然后对其进行解析。

postRef.orderByChild('createData').orderByChild('createData').on('child_added',(data)=>{
console.log(data.val().name + data.val().createData);})

答案 5 :(得分:0)

如果要在前端显示它,建议您在检索数据后,使用JavaScript的reverse()函数。

示例:

let result = postRef
  .orderByChild("createData")
  .startAt(reverseDate)
  .limitToFirst(1)
  .on("child_added", data => {
    console.log(data.val().name + data.val().createData);
  });

result.reverse();

答案 6 :(得分:0)

使用Swift的reversed()更容易了: https://developer.apple.com/documentation/swift/array/1690025-reversed https://developer.apple.com/documentation/swift/reversedcollection

let decodedIds = try DTDecoder().decode([String].self, from: value)
// we reverse it, because we want most recent orders at the top
let reversedDecodedIds = decodedIds.reversed().map {$0}