如何使用Firebase按时间戳排序? [英] how to order by timestamp using Firebase?

查看:133
本文介绍了如何使用Firebase按时间戳排序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图使用 orderByChild()在Firebase中的时间戳进行排序,但不起作用。结果似乎是按键排序,Firebase似乎忽略 orderByChild()



从时间上看,这些结果不是按时间戳排序的。


lorem-ipsum-dolor-si - 17/6/2016 a las 8:51:33

lorem-ipsum-dolor-si193 - 17/6/2016 a las 8:51:37

lorem-ipsum-dolor-si297 - 17/6/2016 a las 8:51:43

lorem-ipsum-dolor-si402 - 17 / 6/2016 a las 8:51:38

这就是我得到的数据:

'pre> 让端点= '文本/ -KKPSjKwelbXG6Rq8AEh / -KKQqtg_a95p4Gm13XgZ'
firebase.database()。参考文献(端点).orderByChild( '时间戳')。上('value',...)

snapshot.val )将被按键排序,而不是按照$ $ c $ orderByChild()顺序排序,我必须将快照排序在一个数组中,然后发送回到视图。

  this.data = [] 

snapshot.forEach(function(child){
this.data.push(child.val())
}。 bind(this))

return this.data

时间戳来自 Date.now()。我已经尝试将它存储为 Number String ,结果相同。



它可以在Firebase中正常存储:

  {
-KKPSjKwelbXG6Rq8AEh: {
-KKQqtg_a95p4Gm13XgZ:{
lorem-ipsum-dolor-si:{
body:\t< body> \\\
\t\tLorem存有悲坐阿梅德,consectetur adipisicing ELIT,sed的根本eiusmod tempor incididunt UT labore等dolore麦格纳aliqua。UT enim广告微量veniam,QUIS nostrud实习ullamco laboris暂准UT aliquip前EA commodo consequat。DUIS奥特irure悲在reprehenderit在voluptate velit埃塞cillum dolore EU fugiat法无pariatur Excepteur SINT occaecat cupidatat非proident,必须遵守在过失魁正式开通了deserunt mollit阿尼姆ID EST laborum.\\\
\t< /体>中,
的时间戳:1466171493149
},
lorem-ipsum-dolor-si193:{
body:\t< body> \\\
\t\tLorem我psum dolor sit amet,consectetur adipisicing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。如果你想让自己的工作变得更加简单, Duis aute irure dolor in rennederit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Excepteur SINT occaecat cupidatat非proident,必须遵守在过失魁正式开通了deserunt mollit阿尼姆ID EST laborum.\\\
\t< /体>中,
的时间戳:1466171497193
},
lorem-ipsum-dolor-si297:{
body:\t< body> \\\
\t\tLorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。如果你想让自己的工作变得更加简单, Duis aute irure dolor in rennederit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Excepteur SINT occaecat cupidatat非proident,必须遵守在过失魁正式开通了deserunt mollit阿尼姆ID EST laborum.\\\
\t< /体>中,
的时间戳:1466171503297
},
lorem-ipsum-dolor-si402:{
body:\t< body> \\\
\t\tLorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。如果你想让自己的工作变得更加简单, Duis aute irure dolor in rennederit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 Excepteur sint occaecat cupidatat non proident,sunt in culpa qui officia deserunt mollit anim id est laborum. \\\
'\\t< / body>,
timestamp:1466171498402
}
}


$ / code $ / pre

我缺少什么?

编辑:

问题是我正在创建引用,后来添加 orderByChild()
$ p $ let ref = firebase.database()。ref(endpoint)
...
ref.orderByChild('timestamp')
...
ref.on('value',onChange)

我之所以这样做,是因为我有一个类动态地创建了对Firebase的这些调用。

解决方案

适用于我:

  firebase.database()。ref(endpoint)
.orderByChild('timestamp ')
.on('value',function(snapshot){
this.data = [];

snapshot.forEach(function(child){
this.data.pu sh(child.val());
} .bind(this));
$ b console.log(all,data.map(function(val){return new Date(val.timestamp).toString();}));
});




全部



[Fri Jun 17 2016 06:51:33 GMT-0700(PDT),Fri Jun 17 2016 06:51:37 GMT-0700(PDT),Fri Jun 17 2016 06:51: 38 GMT-0700(PDT),Fri Jun 17 2016 06:51:43 GMT-0700(PDT)]
Blockquote




  firebase.database()。ref(endpoint)
.orderByChild('timestamp')
.startAt(1466171497190)
.endAt (1466171498405)
.on('value',function(snapshot){
this.data = [];

snapshot.forEach(function(child){$ b $ (this));

console.log(filtered,data.map(function(val) {return new Date(val.timestamp).toString();}));

});




已过滤

[Fri Jun 17 2016 06:51:37 GMT-0700(PDT),Fri Jun 17 2016 06:51:38 GMT-0700(PDT)]


http://jsbin.com/humatuquju /编辑?js,控制台


I'm trying to order by timestamp in Firebase using orderByChild() but it's not working. The results seem to be ordered by the key and Firebase seems to be ignoring orderByChild().

As you can see from the time, these results are not ordered by timestamp.

lorem-ipsum-dolor-si - 17/6/2016 a las 8:51:33

lorem-ipsum-dolor-si193 - 17/6/2016 a las 8:51:37

lorem-ipsum-dolor-si297 - 17/6/2016 a las 8:51:43

lorem-ipsum-dolor-si402 - 17/6/2016 a las 8:51:38

This is how I get the data:

let endpoint = 'texts/-KKPSjKwelbXG6Rq8AEh/-KKQqtg_a95p4Gm13XgZ'
firebase.database().ref(endpoint).orderByChild('timestamp').on('value',...)

And since snapshot.val() will be ordered by the keys, and not by the orderByChild() order, I have to store the snapshot ordered in an array and send it back to the view.

this.data = []

snapshot.forEach(function(child) {
    this.data.push(child.val())
}.bind(this))

return this.data

The timestamp comes from Date.now(). I've tried storing it as Number or String with the same result.

It's storing fine in Firebase as you can see:

{
  "-KKPSjKwelbXG6Rq8AEh" : {
    "-KKQqtg_a95p4Gm13XgZ" : {
      "lorem-ipsum-dolor-si" : {
        "body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
        "timestamp" : 1466171493149
      },
      "lorem-ipsum-dolor-si193" : {
        "body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
        "timestamp" : 1466171497193
      },
      "lorem-ipsum-dolor-si297" : {
        "body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
        "timestamp" : 1466171503297
      },
      "lorem-ipsum-dolor-si402" : {
        "body" : "\t<body>\n\t\tLorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n\t</body>",
        "timestamp" : 1466171498402
      }
    }
  }
}

What am I missing?

Edit:

The problem was that I was creating the reference and later adding orderByChild().

let ref = firebase.database().ref(endpoint)
...
ref.orderByChild('timestamp')
...
ref.on('value',onChange)

I was doing that because I have a class that creates these calls to Firebase dynamically.

解决方案

Works for me:

firebase.database().ref(endpoint)
  .orderByChild('timestamp')
  .on('value', function(snapshot) {
  this.data = [];

  snapshot.forEach(function(child) {
    this.data.push(child.val());
  }.bind(this));

  console.log("all", data.map(function(val) { return new Date(val.timestamp).toString(); }));
});

"all"

["Fri Jun 17 2016 06:51:33 GMT-0700 (PDT)", "Fri Jun 17 2016 06:51:37 GMT-0700 (PDT)", "Fri Jun 17 2016 06:51:38 GMT-0700 (PDT)", "Fri Jun 17 2016 06:51:43 GMT-0700 (PDT)"] Blockquote

firebase.database().ref(endpoint)
  .orderByChild('timestamp')
  .startAt(1466171497190)
  .endAt(1466171498405)
  .on('value', function(snapshot) {
  this.data = [];

  snapshot.forEach(function(child) {
    this.data.push(child.val());
  }.bind(this));

  console.log("filtered", data.map(function(val) { return new Date(val.timestamp).toString(); }));

});

"filtered"

["Fri Jun 17 2016 06:51:37 GMT-0700 (PDT)", "Fri Jun 17 2016 06:51:38 GMT-0700 (PDT)"]

http://jsbin.com/humatuquju/edit?js,console

这篇关于如何使用Firebase按时间戳排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆