有效查询Firebase
我想从每个用户名称值search我的用户群。 从我在网上看到的人们经常返回所有的用户,然后在表格视图中筛选,但这似乎并不实际,也不可行。 我的想法是查询数据并返回指数级数值的数组,但是我在使用提供的查询方法时遇到了问题。
如何查询我的数据库的特定方面?
我如何构build我的代码,使其可行 ; 不加载每个用户,一次最多10个。
任何build议,资源和链接,不胜感激。
编辑:
我做了一些研究,看起来Firebase带有一些内置的查询方法…到目前为止,这是我试图用下面的代码来testing它打印出用户从我开始,但我不能它打印控制台中的任何用户
ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}") .observe(.childAdded, with: { snapshot in print(snapshot.key) })
有一些解决scheme经常加载所有用户数据太多的数据。
这是一个典型的用户节点
users uid_0 name: "Jean Luc" uid_1 name: "Will" uid_2 name: "Geordi"
一种select是逐个遍历每个用户节点,以检索用户名。 这完全避免了庞大的数据集。 我们将使用.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) })
第二个select是将用户名存储在完全不同的节点中,这样可以大大减less“杂乱”,因为其余数据仍保留在主用户节点中
user_names uid_0: "Jean Luc" uid_1: "Will" uid_2: "Geordi"
正如你可以看到这个结构,即使有成千上万的名字,它只是一个非常小的文字。
另一个select是使用.startingAt和.endingAt一次加载X个用户,并遍历返回的用户以获取每个名称。 在这种情况下,我们希望所有用户以A开头,结束于M … Sorry 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开头的所有值。