1

私のアプリケーションは、画像が優先度として投稿されたときのタイムスタンプを使用して、各写真 (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)

次のタスクは、画像のリストを時系列または人気順 (いいね) で表示できるようにすることです

child_addedそれらを時系列でリストしてページ付けすることは、イベントと一緒にstartAt使用することでかなり簡単limitですが、それらを人気順に表示するときにデータをどのように構造化してクエリするべきかわかりません。

私はいくつかのアプローチを念頭に置いていますが、それらはすべてかなり粗雑です:

  • すべての画像を取得し、クライアントで並べ替えとページ付けを行います (最大で 1,000 個の画像があります)。
  • 実際のデータの値を参照ポインターとして使用して、人気度 ( count など)によって優先される別の Firebase データ構造を作成します。
4

1 に答える 1

2

あなたは私が選んだであろう両方の答えを打ちました。せいぜい1000で、クライアントでそれを行うだけで時間とエネルギーを節約できると思います。

サーバー上で実行する必要があり、データを複製したくない場合に頭に浮かぶもう1つの強引なアプローチは、インデックスを作成することです。これは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サイズのオーディエンスにサービスを提供しない限り、大したことではないかもしれません:)

これは常にトレードオフです。この場合、ストレージスペースを速度と帯域幅と交換します:)

アップデート

ちなみに、データを作成するために並べ替えの優先順位を追加する必要はないと思います。値は、作成時間によって自然にソートされます。

于 2013-01-09T15:54:35.797 に答える