查询可用于将大型商品过滤到适合与客户端同步的较小数量。
分页也有同样的目的,即将项目限制为适合客户提取的较小数字。
考虑以下数据库架构:
"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)
这不起作用,因为:
您一次只能使用一个order-by方法。拨打订单 多次在同一查询中抛出一个错误。
在我花了两天时间思考如何解决这种情况之后,我才能想出这个“反最佳实践”解决方案。
我修改了数据库架构。我将活动布尔值转换为字符串,并将其附加到键后面,以便为键提供顺序重要性控制。这就是它现在的样子:
"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)
不知怎的,我的大脑拒绝在键中包含键的想法,因为它可能是最糟糕的肮脏解决方案。我想知道针对这种特殊情况的正确解决方案,我们将非常感谢任何解决方案。
答案 0 :(得分:0)
只需将其添加到您的JSON树: -
PreferredLanguages
在此之后,只需按照以下答案: - Retrieving 5 user's at a time,根据您的要求进行修改。
注意: - 通过执行子项计数来检索该答案中的用户/帖子总数。鉴于您的数据库繁重,您可能希望将totalNoOfUser存储在单独的节点中,并在每次添加新用户时将其递增。