有效查询firebase

时间:2017-07-16 20:23:22

标签: ios swift firebase firebase-realtime-database firebase-storage

我想从每个用户名值中搜索我的用户群。根据我所看到的,在线人们经常会返回所有用户,然后在表格视图中对其进行过滤,但这看起来既不实际也不可行。我的想法是查询数据并返回指数级较小的值数组,但我无法使用提供的查询方法。

如何查询数据库的特定方面?

如何构建我的代码以使其可行;没有加载到每个用户,一次最多10个。

非常感谢任何建议,资源和链接。

修改

我做了一些研究,看起来Firebase附带了一些内置的查询方法......到目前为止,这是我尝试使用下面的代码测试它以打印出以I开头的用户,但是我无法在控制台中打印任何用户

 ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}")
        .observe(.childAdded, with: { snapshot in
            print(snapshot.key)
        })

1 个答案:

答案 0 :(得分:1)

有许多解决方案,并且经常加载所有用户数据的数据太多。

这是一个典型的用户节点

users
  uid_0
    name: "Jean Luc"
  uid_1
    name: "Will"
  uid_2
    name: "Geordi"

一种选择是迭代每个用户节点,一次一个,以检索用户名。这完全避免了庞大的数据集。我们将使用.childAdded事件加载每个事件并存储在数组中

    let usersRef = self.ref.child("users")
    var userNamesArray = [String]()

    usersRef.observe(.childAdded, with: { snapshot in
        let userDict = snapshot.value as! [String: Any]
        let name = userDict["name"] as! String
        userNamesArray.append(name)
    })

第二种选择是将用户名存储在一个完全不同的节点中,这样可以显着减少“混乱”。因为其余数据仍保留在主用户节点

user_names
   uid_0: "Jean Luc"
   uid_1: "Will"
   uid_2: "Geordi"

正如您所看到的那样,即使有数以千计的名称,它也只是一个占地面积很小的文本。

另一种选择是使用.startingAt和.endingAt一次加载X个用户,并迭代返回的用户以获取每个名称。在这种情况下,我们希望所有用户以A开头并以M结尾...抱歉Worf。

    let usersRef = self.ref.child("users")
    var userNamesArray = [String]()

    let nameQuery = usersRef.queryOrdered(byChild: "name")
                            .queryStarting(atValue: "A")
                            .queryEnding(atValue: "M\u{f8ff}")
    nameQuery.observe(.value, with: { snapshot in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let userDict = snap.value as! [String: Any]
            let name = userDict["name"] as! String
            userNamesArray.append(name)
        }
    })

最后一个示例以用A开头的用户名开头,用以M +结尾的用户名结束,这是一个非常高的unicode字符,这使得它包含所有以M开头的名字

  

上面查询中使用的\ uf8ff字符是一个非常高的代码点   在Unicode范围内。因为它是在大多数常规字符之后   Unicode,查询匹配以queryString开头的所有值。