【问题标题】:how to order by timestamp using Firebase?如何使用 Firebase 按时间戳排序?
【发布时间】:2016-10-19 09:54:30
【问题描述】:

我正在尝试使用 orderByChild() 在 Firebase 中按时间戳排序,但它不起作用。结果似乎是按键排序的,而 Firebase 似乎忽略了orderByChild()

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

lorem-ipsum-dolor-si - 17/6/2016 拉斯 8:51:33

lorem-ipsum-dolor-si193 - 17/6/2016 拉斯 8:51:37

lorem-ipsum-dolor-si297 - 17/6/2016 拉斯 8:51:43

lorem-ipsum-dolor-si402 - 17/6/2016 拉斯 8:51:38

这就是我获取数据的方式:

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

由于snapshot.val() 将按键排序,而不是按orderByChild() 顺序,我必须将排序的快照存储在数组中并将其发送回视图。

this.data = []

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

return this.data

时间戳来自Date.now()。我尝试将其存储为NumberString,结果相同。

如您所见,它在 Firebase 中存储良好:

{
  "-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
      }
    }
  }
}

我错过了什么?

编辑:

问题是我创建了引用,后来又添加了orderByChild()

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

我这样做是因为我有一个类可以动态创建这些对 Firebase 的调用。

【问题讨论】:

  • 您能否在问题中添加以下内容:ref(...) 指向什么?您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • 确保所有信息都以可搜索的格式出现在您的问题中。没有文字链接,请不要文字图片。
  • 完成。我没有放完整的数据,因为它几乎是一样的。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

为我工作:

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

“全部”

[“2016 年 6 月 17 日星期五 06:51:33 GMT-0700 (PDT)”、“2016 年 6 月 17 日星期五 06:51:37 GMT-0700 (PDT)”、“2016 年 6 月 17 日星期五 06:51:38 GMT-0700 (PDT)”、“2016 年 6 月 17 日星期五 06:51:43 GMT-0700 (PDT)”] 块引用

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

});

“过滤”

[“2016 年 6 月 17 日星期五 06:51:37 GMT-0700 (PDT)”、“2016 年 6 月 17 日星期五 06:51:38 GMT-0700 (PDT)”]

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

【讨论】:

  • 很高兴听到。请注意,创建minimal, complete example 将避免在这里来回切换的需要。从头开始是至关重要的,因为它会迫使你重新思考。 jsbin/jsfiddle 链接是实现此目的的好方法。
  • 你是对的。我以为设置会比较困难,但是在看到你的 jsbin 之后,它很简单。
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2012-10-18
相关资源
最近更新 更多