订购Firebase数据的多个视图

时间:2013-01-09 08:35:54

标签: firebase

我的应用程序使用从发布图像时的时间戳作为优先级,从多个来源收集每张照片(网址)添加到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(createdAt).setWithPriority(data, data.createdAt)

下一个任务是能够按时间顺序或受欢迎程度显示图像列表(喜欢)。

使用child_added事件以及startAtlimit按时间顺序列出和分页它们是相当微不足道的但是我不确定我应该如何构造和查询我的数据按人气顺序观看时。

我有几个方法,但所有这些方法都很粗糙:

  • 获取每张图片并在客户端进行排序和分页(最多会有一千张图片)
  • 创建另一个Firebase数据结构,该结构按受欢迎程度划分优先级( like count ),并将实际数据的值作为参考指针。

1 个答案:

答案 0 :(得分:2)

你已经找到了我想要的答案。最多只有一千,我认为你将节省时间和精力,只是在客户端做到这一点。

另一种蛮力方法是,如果您需要在服务器上完成并且不想复制数据,则可以创建索引。这不是一个有效的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大小的观众服务:)

总是需要权衡利弊。在这种情况下,您需要交换存储空间以获得带宽:)

更新

顺便说一句,我认为您不需要为创建数据添加排序优先级。这些值按创建时间自然排序。