首页 文章

有效地查询firebase

提问于
浏览
0

我想从每个用户名值中搜索我的用户群 . 从我在网上看到的人们经常会返回所有用户,然后在表格视图中过滤它们,但这似乎不实际也不可行 . 我的想法是查询数据并返回指数级较小的值数组,但我在使用提供的查询方法时遇到问题 .

How do I query a specific aspect of my database?

How do I structure my code so that it's viable ;不加载每个用户,一次最多10个 .

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

EDIT:

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

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

1 回答

  • 0

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

    这是一个典型的用户节点

    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开头的所有值 .

相关问题