Запрос можно использовать для фильтрации больших предметов до меньшего числа, подходящего для синхронизации с клиентом.
Pagination также служит той же цели, то есть ограничить предметы меньшими числами, подходящими для клиента.Firebase Combining Query and Pagination
Рассмотрим следующую схему базы данных:
"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"
}
}
Если бы я, чтобы все активные пользователи, это будет выглядеть следующим образом: (код в Swift)
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 активных пользователей одновременно. Да, это правильно. –