5

tl;drを介しstartAtてFirebase で基本的なページネーションを実行するのは非常に複雑です。もっと簡単な方法があるはずです。endAtlimit

多数のユーザー送信用の管理インターフェイスを構築しています。私の最初の (そして現在の) アイデアは、単純にすべてを取得し、クライアントでページネーションを実行することです。ただし、2000 以上のレコード (それぞれ 5 ~ 6 個の小さな数値/文字列フィールドを含む) をフェッチすると、1.5 MB を超えるデータ ペイロードに起因する顕著な遅延が発生します。

現在、すべてのエントリは経由で追加されていますがpush、巨大なリストをページ分割する方法について少し迷っています。

私が使用endAtしているデータの最初のページをlimit5 で取得するには:

ref.endAt().limit(10).on('child_added', function(snapshot) {
    console.log(snapshot.name(), snapshot.val().name)
})

その結果、次のようになります。

-IlNo79stfiYZ61fFkx3 #46 John
-IlNo7AmMk0iXp98oKh5 #47 Robert
-IlNo7BeDXbEe7rB6IQ3 #48 Andrew
-IlNo7CX-WzM0caCS0Xp #49 Frank
-IlNo7DNA0SzEe8Sua16 #50 Jimmmy

まず、ページ数を把握するために、誰かがレコードを追加または削除するたびに更新される別のカウンターを保持しています。

第二に、私が使用しpushているので、特定のページの最後のレコードの名前がわからないため、特定のページに移動する方法がありません。つまり、このようなインターフェイスは現在不可能です。

標準のページネーション コントロール

簡単にするために、次/前のボタンを単純に配置することにしましたが、これには新しい問題もあります。前の結果セットの最初のレコードの名前を使用すると、次を使用して次のページに改ページできます。

ref.endAt(null, '-IlNo79stfiYZ61fFkx3').limit(5).on('child_added', function(snapshot) {
    console.log(snapshot.name(), snapshot.val().name)
})

この操作の結果は次のとおりです。

-IlNo76KDsN53rB1xb-K #42 William
-IlNo77CtgQvjuonF2nH #43 Christian
-IlNo7857XWfMipCa8bv #44 Jim
-IlNo78z11Bkj-XJjbg_ #45 Richard
-IlNo79stfiYZ61fFkx3 #46 John

これで次のページができましたが、位置が 1 つずれているため、制限を調整して最後のレコードを無視する必要があります。

1 ページ戻るには、これまでに受け取ったすべてのレコードのリストをクライアントに個別に保持し、どの名前に渡すかを決定する必要がありstartAtます。

これを行う簡単な方法はありますか、それともすべてをフェッチすることに戻るべきですか?

4

3 に答える 3

7

ページネーションを簡単にするために、「offset()」クエリの追加に取り組んでいます。また、特別なエンドポイントを追加して、サーバーから実際にロードすることなく、ある場所にある子の数を読み取ることができるようにします。

ただし、どちらも少し時間がかかります。それまでの間、あなたが説明する方法 (またはクライアント上ですべて実行する方法) がおそらく最善の策です。

追加専用のデータ構造がある場合は、データを書き込むときにページネーションも実行できる可能性があります。例: 最初の 50 を /page1 に入れ、2 番目の 50 を /page2 に入れます。

于 2013-01-20T18:15:37.140 に答える
4

これを達成する別の方法は、2 つのツリーを使用することです。

ID のツリー: { id1: id1, id2: id2, id3: id3 }

データのツリー: { id1: ..., id2: ..., id3: ... }

次に、ID のツリー全体 (またはその大きなチャンク) をクライアントにロードし、その ID のツリーで派手なページネーションを行うことができます。

于 2013-01-22T21:45:51.617 に答える
2

これは、各方向のページネーションのハックです。

// get 1-5
ref.startAt().limit(5)

// get 6-10 from 5
ref.startAt(null, '5th-firebase-id' + 1).limit(5)

// get 11-15 from 10
ref.startAt(null, '10th-firebase-id' + 1).limit(5)

基本的にはハックですstartAtExclusive()。id の最後まで何でも構いません。

endAtExclusive()また、後退することも考え出しました。

// get 6-10 from 11
ref.endAt(null, '11th-firebase-id'.slice(0, -1)).limit(5)... 

// get 1-5 from 6
ref.endAt(null, '6th-firebase-id'.slice(0, -1)).limit(5)... 

これでもう少し遊んでみますが、プッシュ ID で動作するようです。firebase クエリを使用している場合は、 limit をlimitToFirstorに置き換えます。limitToLast

于 2014-10-30T21:33:52.390 に答える