将多个视图转换为有序的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

我的应用程序从多个来源收集照片,其中每个照片(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(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
      会在每个孩子到达时给你一个。它基本上是流式的。如果您正在对客户端进行排序,那么只需在每个客户端上运行比较器,以确定将其拼接到列表中的位置