javascript - 如何使用 Firebase 按时间戳排序?

标签 javascript firebase firebase-realtime-database

我正在尝试使用 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

这是我获取数据的方式:

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

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

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 的这些调用。

最佳答案

对我有用:

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

关于javascript - 如何使用 Firebase 按时间戳排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37883620/

相关文章:

javascript - 如何在嵌套的 Json 中使用 angularjs 进行过滤

javascript - 可见:false and hidden:true之间的区别

javascript - Vue.js 2 页面和元素转换与 vue-router

firebase - 使用带有 IntelliJ Ultimate/WebStorm 的模拟器调试本地 Firebase 函数时不触发断点

javascript - HTML 单选按钮 Javascript

ios - Swift macOS Firebase

ios - 从 Firebase 中删除 Google 或 Facebook 用户

javascript - 使用 JavaScript 过滤 Firebase 查询

java - JsonMappingException : No suitable constructor found

vue.js - [Vue 警告] : Property or method "names" is not defined on the instance but referenced during render