首页 > 解决方案 > Firebase 实时数据库:未能按时间戳对数据进行排序

问题描述

我有一个数据库列表,包含10000多条记录,每条记录都有EmailDate键,并且Date是一个时间戳。

orderByChild使用无序检索数据对数据进行排序。代码片段:

firebase.database().ref('users').orderByChild('Date').once('value').then((d)=>{
  let users = d.val();
  Object.keys(users).map( 
    k => console.log( new Date(users[k].Date) )
  );
});

记录:

{
  "users" : {
    "-MNfAJqQps-t3tPexBXD" : {
      "Date" : 1587827466215
    },
    "-MNfAO1PbkcLOqjjrk2o" : {
      "Date" : 1593781601194
    },
    "-MNfAcnfCZ7bpEGO9lMX" : {
      "Date" : 1588037833767
    },
    "-MNfAcnfCZ7bpEGO9lMY" : {
      "Date" : 1590966701420
    },
    "-MNfAcngMq0yQfq-zJD7" : {
      "Date" : 1574637809000
    },
    "-MNfAcngMq0yQfq-zJD8" : {
      "Date" : 1565127290858
    },
    "-MNfAcnhU0gK2PfDRYdU" : {
      "Date" : 1566914768371
    },
    "-MNfAcnhU0gK2PfDRYdV" : {
      "Date" : 1580480141148
    },
    "-MNfAcnirZFlPnikmjA9" : {
      "Date" : 1604432784043
    },
    "-MNfAcnirZFlPnikmjAA" : {
      "Date" : 1563010563269
    }
  }
}

规则:

{
  "rules": {
    ".read": "true",
    ".write": "false",
    "users": {
      ".indexOn": "Date"
    }
  }
}

结果:

4/25/2020, 5:11:06 PM
7/3/2020, 3:06:41 PM
4/28/2020, 3:37:13 AM
6/1/2020, 1:11:41 AM
11/25/2019, 1:23:29 AM
8/6/2019, 11:34:50 PM
8/27/2019, 4:06:08 PM
1/31/2020, 4:15:41 PM
11/3/2020, 9:46:24 PM
7/13/2019, 11:36:03 AM

标签: firebasefirebase-realtime-databasefirebase-security

解决方案


一旦调用 d.val(),子节点的顺序就会丢失。d所以你应该使用forEachbefore循环d.val()

firebase.database().ref('users').orderByChild('Date').once('value', d=> {
  d.forEach(child => {
    const child_data = child.val();
    const date = child_data.Date;
    console.log(new Date(date));
  })
})

推荐阅读