自编写此答案以来,Firebase 添加了一项功能,允许按任何子项或按值排序。因此,现在有四种方法可以对数据进行排序:按键、按值、按优先级或按任何指定子项的值。看到这个介绍新订购功能的博客文章 https://www.firebase.com/blog/2014-11-04-firebase-realtime-queries.html.
但基本方法保持不变:
1. 添加具有反转时间戳的子属性,然后对其进行排序。
2. 按升序读取子项,然后在客户端上反转它们。
Firebase 支持通过两种方式检索集合的子节点:
您现在得到的是按名称排列的,这恰好是按时间顺序排列的。顺便说一句,这并非巧合:当你push
将项目放入集合中时,会生成名称以确保子项按这种方式排序。引用Firebase 文档push https://www.firebase.com/docs/web/api/firebase/push.html:
Push() 生成的唯一名称以客户端生成的时间戳为前缀,以便结果列表将按时间顺序排序。
The Firebase 有序数据指南 https://www.firebase.com/docs/web/guide/retrieving-data.html#section-ordered-data关于这个话题有这样的说法:
数据如何排序
默认情况下,Firebase 节点中的子节点按名称按字典顺序排序。使用push()
可以生成自然按时间顺序排序的子名称,但许多应用程序要求其数据以其他方式排序。 Firebase 允许开发人员通过为每个项目指定自定义优先级来指定列表中项目的顺序。
获得所需行为的最简单方法是在添加项目时指定始终递减的优先级:
var ref = new Firebase('https://your.firebaseio.com/sell');
var item = ref.push();
item.setWithPriority(yourObject, 0 - Date.now());
Update
您还必须以不同的方式检索子项:
fbl.child('sell').startAt().limitToLast(20).on('child_added', function(fbdata) {
console.log(fbdata.exportVal());
})
在我的测试中使用on('child_added'
确保最后添加的几个子项按时间倒序返回。使用on('value'
另一方面,按名称顺序返回它们。
请务必阅读“读取有序数据”部分 https://www.firebase.com/docs/web/guide/retrieving-data.html#section-ordered-data,这解释了使用child_*
检索(有序)子项的事件。
一个 bin 来演示这一点:http://jsbin.com/nonawe/3/watch?js,控制台 http://jsbin.com/nonawe/3/watch?js,console