我是Firebase / swift新手,我尝试使用.indexOn对服务器上的一组节点进行排序。我已经搜索了SO和文档来编写规则,但是我正在努力使用正确的swift代码格式来使用索引。
我的假设是当我使用.indexOn规则时,返回的快照使用该索引来对结果进行排序。通过在swift中使用.queryOrderedByChild(" title"),我否定了创建索引的服务器端性能优势。如果这个假设不正确,请纠正我。
这是我的Firebase数据库结构的简化代码段:
data[ !data$originId %in% filter$originId, ]
这是我的规则JSON:
{
"users": {
"GkdjgdBJh1TxuAzIPezLWRouG9f2": {
"messages": {
"-KM0crettRl-RLQQdmMQ": {
"body": "Anyone want a bit of body string?",
"title": "5 Another title string",
},
"-KM0dhkChY6ZQ2QzuPlC": {
"body": "This is a short body string",
"title": "1 A lovely title string",
},
"-FQ0dhkChY6ZQ2Qzu3RQv": {
"body": "Short and sweet body string",
"title": "3 I should be in the middle",
}
}
}
}
}
这是我的快捷代码:
{
"rules": {
".read": true,
".write": true,
"users": {
"$userid": {
"messages": {
".indexOn": ["title"]
}
}
}
}
}
任何建议如何修改我的Swift代码以使用索引(或纠正索引,如果错误的话)会很棒。
答案 0 :(得分:2)
您需要使用 queryOrderedByChild ,而不是像您一样在规则中输入密钥。这是一个例子;
Firebase文档
以下示例演示了如何检索按星号计算的用户首要帖子列表:
// My top posts by number of stars
let myTopPostsQuery = (ref.child("user-posts").child(getUid())).queryOrderedByChild("starCount")
此查询根据用户ID从数据库中的路径检索用户的帖子,按每个帖子收到的星号数排序。这种使用ID作为索引键的技术称为数据扇出。
对queryOrderedByChild方法的调用指定了用于对结果进行排序的子键。在这种情况下,帖子按" starCount"的值排序。每个岗位的孩子。有关如何排序其他数据类型的更多信息,请参阅如何排序查询数据。
请点击链接了解更多详情;
答案 1 :(得分:2)
首先,您需要按照Jad的回答并指定您希望接收子节点的顺序。单个列表可以包含许多索引,您需要为此特定查询指定所需的顺序。
指定订单后,Firebase数据库会返回一个快照,其中包含与您的查询匹配的节点以及有关这些节点在结果中的显示顺序的信息。
但字典中没有关于孩子顺序的任何信息。因此,当您的代码将快照转换为字典时,有关订单的所有信息都将丢失:
if let dictionaryOfMessages = snapshot.value as? [String: AnyObject] {
出于这个原因,最好使用快照的内置方法来迭代子节点:
for child in snapshot.children {
let key = child.key as String
print(key)
messageArray.append(Message(json: JSON(child.value))) // JSON handling via SwiftyJSON
// set the messageId
messageArray[messageArray.count - 1].messageId = key
}