将多个视图转换为有序的Firebase数据
我的应用程序从多个来源收集照片,其中每个照片(url)都使用图像发布时的时间戳作为优先级添加到Firebase结构中:将多个视图转换为有序的Firebase数据,firebase,Firebase,我的应用程序从多个来源收集照片,其中每个照片(url)都使用图像发布时的时间戳作为优先级添加到Firebase结构中: var data = { createdAt: new Date(2012, 11, 21).getTime(), url: 'http://placekitten.com/320/240', likes: 0 } var images = new Firebase('myapp.firebaseio.com/images') images.child(cr
var data = {
createdAt: new Date(2012, 11, 21).getTime(),
url: 'http://placekitten.com/320/240',
likes: 0
}
var images = new Firebase('myapp.firebaseio.com/images')
images.child(createdAt).setWithPriority(data, data.createdAt)
下一个任务是能够按时间顺序或受欢迎程度(如)显示图像列表
使用事件以及,按时间顺序列出和分页它们是相当简单的,但我不确定在按流行顺序查看数据时应该如何构造和查询数据
我有一些想法,但都很粗糙:
- 获取每个图像并在客户端上进行排序和分页(最多将有1000个图像)
- 创建另一个Firebase数据结构,该结构按流行程度(如计数)排序,实际数据的值作为参考指针
- 你已经找到了我会选择的两个答案。最多一千个,我想你只需要在客户机上做就可以节省时间和精力
如果您需要在服务器上执行这些操作,并且不想复制数据,那么另一种暴力方法就是创建索引。作为一个SQL索引,这不是很有效,但它仍然是可行的,我将把它扔到这里来产生一些想法
基本上,您将拥有照片表:
/photos/$photo_id/ (prioritized by create data)
然后是一个索引:
/photos_indexed_by_likes/$photo_id (prioritized by likes
通过这种方式,您可以执行以下操作:
FB.child('photos_indexed_by_likes').endAt().limit(10).on('child_added', function(snapshot) {
// the snapshot contains the id of a photo, so we fetch it here
FB.child('photos/'+snapshot.val()).once('value', function(ss) {
addPresortedPhotoToList( ss.val() );
});
});
通过实现您将在本页上显示的记录,这是可行的。它确实会单独要求每张照片,但这可能不是什么大问题,除非你服务于twitter大小的观众:)
这总是一种权衡。在这种情况下,您可以用存储空间换取速度换取带宽:)
更新
顺便说一下,我认为您不需要为创建数据添加排序优先级。这些值是按创建时间自然排序的。1000张图像的有效负载约为600kb,因此这是我目前可以接受的。Firebase似乎不会压缩任何传出数据,尽管我觉得这有点奇怪,因为压缩的数据只有~100kb)也许你应该将图像存储在文件系统中,然后通过Firebase访问URL,这会使负载减少到零?这两种方法都是很好的解决方案。我建议使用索引方法,而不是在()上使用一次()来确保这些项目在发生更改时更新。至于压缩,这就要来了。我们只是还没有做到这一点。在Firebase中存储图像应该很好(仅存储URL也很好)。在我收集图像时,图像已经存储在S3上,所以这不是问题。有没有一种方法可以让Firebase流式传输或区块传输,这样我就不必在显示前100张图像之前等待所有的1000张图像?我知道我可以使用limit()函数,但如果将其设置为100,则加载后将从引用中删除下一个100。我认为您根本不需要等待
child_added
会在每个孩子到达时给你一个。它基本上是流式的。如果您正在对客户端进行排序,那么只需在每个客户端上运行比较器,以确定将其拼接到列表中的位置