Firebase - iOS SDK - 按子值过滤

时间:2016-10-05 13:20:28

标签: ios swift firebase firebase-realtime-database

我正在尝试使用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”到您的安全规则以获得更好的性能

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

这个怎么样:

ref.queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType(.Value, with: { snap in  
    print("snap \(snap)")
})

有关更新问题的更新:

将此添加到firebase控制台中的数据库规则中(另请参见屏幕截图)。不要忘记点击“发布”按钮:

"products": {
  ".indexOn": "family"
}

enter image description here

答案 1 :(得分:2)

这是正确的解决方案,我也希望解决警告:

ref.child("products").queryOrderedByChild("family").queryEqualToValue(0).observeSingleEventOfType(.Value, withBlock: { snap in
        print("snap \(snap)")
        expectation.fulfill()
    })

请查看@ronatory answer以处理警告