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 - 按子值过滤的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 和 Swift 如何按子值提取特定记录?

xmlslurper 按子值从 xml 中删除节点

如何获取内部子值 Firebase?

如何读取 Firebase 子值?

如何使用两个子值在 Firebase 中进行搜索?

带有子值的 Firebase 多路径原子更新?