Firebase - iOS SDK - 按子值过滤
Posted
技术标签:
【中文标题】Firebase - iOS SDK - 按子值过滤【英文标题】:Firebase - iOS SDK - filter by child value 【发布时间】:2016-10-05 13:20:28 【问题描述】:我正在尝试使用 Firebase 设置一个新项目,但我正在努力使用非关系数据库和查询系统。我已阅读指南,尤其是有关数据结构的指南。 这是我的用例:我必须处理一些产品,每个产品都有一个名字和一个家庭,这个也是一个实体。 我创建了下面的结构,试图遵循指南和示例。
"families" : [
"name" : "easy",
"products" : [ 10, 11 ]
,
"name" : "ir33",
"products" : [ 12, 13 ]
],
"products" :
"10" :
"family" : 0,
"name" : "Matita"
,
"11" :
"family" : 0,
"name" : "Penna"
,
"12" :
"family" : 1,
"name" : "Gomma"
给定一个家庭,我想选择那个家庭的所有产品。 我的第一个解决方案是访问家庭,检索 ID 数组,然后执行请求(每个 ID 一个)。它有效,但这种方法可能会导致大量请求。 有没有更好的方法来获得它?例如,我正在尝试使用这个,但它不起作用:
ref.child("products").queryOrderedByChild("family").queryEqualToValue("0", childKey: "family").observeSingleEventOfType(.Value, withBlock: snap in
print("snap \(snap)")
)
但它总是打印Snap (products) <null>
。
更新
我可以通过这个查询访问给定系列的产品:
ref.child("products").queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType
顺便说一句,现在我在运行测试时收到此警告:
[FirebaseDatabase] 使用未指定的索引。考虑将 /products 中的 ".indexOn": "family" 添加到您的安全规则中以获得更好的性能
提前感谢您的帮助!
【问题讨论】:
你能试着去掉queryEqualToValue中“0”的引号吗?我认为现在您正在将字符串与数字进行比较,这就是您没有得到任何结果的原因。 忽略它,它只是一个建议警告。 嗨@AndréKool,我已经尝试过了,但这还不够。我用新版本的查询更新了我的答案。 嗨@Dravidian,我知道这只是一个警告,但我也不喜欢它们! 【参考方案1】:这个呢:
ref.queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType(.Value, with: snap in
print("snap \(snap)")
)
关于问题更新的更新:
将此添加到 Firebase 控制台中的数据库规则(另请参见屏幕截图)。不要忘记点击“发布”按钮:
"products":
".indexOn": "family"
【讨论】:
好的,也试过我的版本,用引号“0”表示相等的值? 是的,没错,但还不够。顺便说一句,我更新了我的问题。 不客气,如果您可以将此答案标记为正确或至少给它一个赞成票(因为它不是 100% 正确的解决方案,仅针对您的警告),它将对其他人有所帮助节约时间。谢谢 好的,我会用你的参考来更新我的答案;-) 请也给我投票。【参考方案2】:这是正确的解决方案,我也在寻求解决警告:
ref.child("products").queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType(.Value, withBlock: snap in
print("snap \(snap)")
expectation.fulfill()
)
请查看@ronatory answer处理警告!
【讨论】:
以上是关于Firebase - iOS SDK - 按子值过滤的主要内容,如果未能解决你的问题,请参考以下文章