クエリは、大きなアイテムをクライアントに同期するのに適した小さな番号にフィルタリングするために使用できます。
ページネーシングも同じ目的を果たします。つまり、アイテムをクライアントが取り出すのに適した小さな番号に制限することです。Firebaseクエリとページネーミングの組み合わせ
次のデータベーススキーマを考えてみましょう:
"users": {
"-KRyXWjI0X6UvffIB_Gc": {
"active": true,
"name": "John Doe",
"occupation": "Looking for firebase answer"
},
"-KRyXBWwaK112OWGw5fa": {
"active": false,
"name": "Jane Doe",
"occupation": "Still stuck on combining query and pagination"
},
"-KRyWfOg7Nj59qtoCG30": {
"active": true,
"name": "Johnnie Doe",
"occupation": "There is no greater sorrow than to recall in misery the time when we were stuck"
}
}
私はすべてのアクティブユーザーを取得した場合、それはこのようになります:(スウィフト内のコード)は、フィルタリング後
let usersRef = ref.child("users");
let query = usersRef.queryOrderedByChild("active")
.queryEqualToValue(true)
を、それは10,000人のユーザーと私を残しました。同時にすべてのユーザーを取得することは問題になりません。それは改ページされなければならない。
ページ分割を行うには、のキー以外の一意のソート値でクエリを実行する必要があります。これは、今どのように見えるかです:
let usersRef = ref.child("users");
let query = usersRef.queryOrderedByChild("active")
.queryEqualToValue(true)
let usersPerPage = 10;
query.queryOrderedByKey()
.queryStartingAtValue(lastKey)
.queryLimitedToFirst(usersPerPage)
ので、これは動作しません:あなたは一度に一桁ずつメソッドを使用することができます
。同じクエリで メソッドを複数回呼び出すと、エラーが発生します。
私はこの状況をどう解決すればいいか考えて2日間過ごした後、私はこの「ベストプラクティス」の解決策を考え出すことができます。
データベーススキーマを変更しました。 アクティブブール値を文字列に変換し、それをキーの後ろに追加して、キーに注文重要度コントロールを与えます。これは、今どのように見えるかです:
"users": {
"-KRyXWjI0X6UvffIB_Gc": {
"key_active": "-KRyXWjI0X6UvffIB_Gc true"
"active": true,
"name": "John Doe",
"occupation": "Looking for firebase answer"
}
}
今、私は改ページと単一ORDERBYを使用してクエリの両方を行うことができます:
let usersPerPage = 10;
query.queryOrderedByChild("key_active")
.queryStartingAtValue("\(lastKey) true")
.queryLimitedToFirst(usersPerPage)
どういうわけか私の脳は、内部キーを持つという考えを拒否しますキーです。なぜなら、それは最悪の汚い解決策であるからです。私はこの特定の状況のための正しい解決策を知りたい、どんな解決策も大いに評価されるだろう。
基本的に一度に10人のユーザーしか検索しないようにしたいですか? – Dravidian
アクティブユーザーは一度に10人です。それは正解です。 –