我有这样的数据结构:
{
"inbox_events": {
"from_users": {
"uid1": {
"uid2": 1501337181,
"uid3": 1501337183,
"uid4": 1501337179
},
"uid2" : {
"uid6": 1501337284,
"uid1": 1501337295
}
}
}
}
遵守以下规则:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"inbox_events": {
"from_users": {
"$userId": {
".indexOn": ".value"
}
}
}
}
}
问题:我不明白为什么值的索引不起作用。在firebase控制台中,每个$userId
的条目仍按字母顺序排序,如果我执行queryOrderedByValue
,则表示我没有得到排序结果。
我是否误读了Firebase文档?
提前致谢!
修改
具体来说,我试图像这样查询数据:
let queryRef = Database.database().reference().child("inbox_events").child("from_users").child("uid1").queryOrderedByValue()
queryRef.observe(.value, with: { (snapshot) in
print("key: \(snapshot.key), value: \(snapshot.value)")
})
为了获得uid
节点uid1
s的降序值的排序列表。
答案 0 :(得分:3)
这很容易被忽视。
结果合并为一个快照,打印时,数据将转换为字典,从而使其失去顺序。
要维护正确的顺序,请迭代返回的快照。
这是使用转换后的快照的代码,然后是如何迭代快照以维护顺序
let queryRef = self.ref.child("inbox_events").child("from_users").child("uid1").queryOrderedByValue()
queryRef.observe(.value, with: { (snapshot) in
//converts to dict
print("key: \(snapshot.key), value: \(snapshot.value)")
//keeps the order
for child in snapshot.children {
let snap = child as! DataSnapshot
print("key: \(snap.key), value: \(snap.value)")
}
})