在 Firebase 中查询嵌套元素
Querying nested elements in Firebase
我正在尝试使用 swift 对 Firebase collection 进行查询。
我的Collection是这样的:
{
"networks" : {
"-KF9zQYGA1r_JiFam8gd" : {
"category" : "friends",
"members" : {
"facebook:10154023600052295" : true
},
"name" : "My friends",
"owner" : "facebook:10154023600052295",
"picture" : "https://my.img/img.png"
},
"-KF9zQYZX6p_ra34DTGh" : {
"category" : "friends",
"members" : {
"tototata" : true
},
"name" : "My friends2",
"owner" : "facebook:10154023600052295",
"picture" : "https://my.img/img.png"
}
}
我的查询是这样的:
let networksRef = ref.childByAppendingPath("networks")
.queryOrderedByChild("members")
.queryEqualToValue(true, childKey: uid)
然后我使用 FirebaseUI 填充 TableView。
问题是查询没有 return 任何东西,我也尝试过使用这种查询:
let networksRef = ref.childByAppendingPath("networks")
.queryOrderedByChild("members")
.queryStartingAtValue(true, childKey: uid)
.queryEndingAtValue(true, childKey: uid)
需要说明的是,"uid"是嵌套在"members"节点中的节点名,值为true。 (如图)
由于要下载的数据量大,所以不过滤无法获取所有节点
我坚持了一天,我快疯了..:-)
如果有人可以帮忙?
正确的语法是:
let networksRef = ref.childByAppendingPath("networks")
.queryOrderedByChild("members/\(uid)")
.queryEqualToValue(true)
但请注意,您需要为每个 uid 建立一个索引才能有效地工作:
{
"rules": {
"networks": {
".indexOn": ["facebook:10154023600052295", "tototata"]
}
}
}
如果没有这些索引,Firebase 客户端将下载所有数据并在本地进行过滤。结果是一样的,但是会消耗很多不需要的带宽。
一个合适的解决方案需要你改变你的数据结构。在 Firebase(以及大多数其他 NoSQL 数据库)中,您通常最终会以应用程序想要访问它的方式对数据进行建模。由于您正在寻找用户所属的网络,因此您应该存储每个用户的网络:
"networks_per_uid": {
"facebook:10154023600052295": {
"-KF9zQYGA1r_JiFam8gd": true
},
"tototata": {
"-KF9zQYZX6p_ra34DTGh": true
},
}
将这个所谓的索引添加到您的数据结构称为反规范化,在 this blog post, the documentation on data structuring and this great article about NoSQL data modeling 中介绍。
我正在尝试使用 swift 对 Firebase collection 进行查询。
我的Collection是这样的:
{
"networks" : {
"-KF9zQYGA1r_JiFam8gd" : {
"category" : "friends",
"members" : {
"facebook:10154023600052295" : true
},
"name" : "My friends",
"owner" : "facebook:10154023600052295",
"picture" : "https://my.img/img.png"
},
"-KF9zQYZX6p_ra34DTGh" : {
"category" : "friends",
"members" : {
"tototata" : true
},
"name" : "My friends2",
"owner" : "facebook:10154023600052295",
"picture" : "https://my.img/img.png"
}
}
我的查询是这样的:
let networksRef = ref.childByAppendingPath("networks")
.queryOrderedByChild("members")
.queryEqualToValue(true, childKey: uid)
然后我使用 FirebaseUI 填充 TableView。
问题是查询没有 return 任何东西,我也尝试过使用这种查询:
let networksRef = ref.childByAppendingPath("networks")
.queryOrderedByChild("members")
.queryStartingAtValue(true, childKey: uid)
.queryEndingAtValue(true, childKey: uid)
需要说明的是,"uid"是嵌套在"members"节点中的节点名,值为true。 (如图)
由于要下载的数据量大,所以不过滤无法获取所有节点
我坚持了一天,我快疯了..:-)
如果有人可以帮忙?
正确的语法是:
let networksRef = ref.childByAppendingPath("networks")
.queryOrderedByChild("members/\(uid)")
.queryEqualToValue(true)
但请注意,您需要为每个 uid 建立一个索引才能有效地工作:
{
"rules": {
"networks": {
".indexOn": ["facebook:10154023600052295", "tototata"]
}
}
}
如果没有这些索引,Firebase 客户端将下载所有数据并在本地进行过滤。结果是一样的,但是会消耗很多不需要的带宽。
一个合适的解决方案需要你改变你的数据结构。在 Firebase(以及大多数其他 NoSQL 数据库)中,您通常最终会以应用程序想要访问它的方式对数据进行建模。由于您正在寻找用户所属的网络,因此您应该存储每个用户的网络:
"networks_per_uid": {
"facebook:10154023600052295": {
"-KF9zQYGA1r_JiFam8gd": true
},
"tototata": {
"-KF9zQYZX6p_ra34DTGh": true
},
}
将这个所谓的索引添加到您的数据结构称为反规范化,在 this blog post, the documentation on data structuring and this great article about NoSQL data modeling 中介绍。