代码之家  ›  专栏  ›  技术社区  ›  Stefan

高效查询firebase

  •  1
  • Stefan  · 技术社区  · 8 年前

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

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

    我该如何构造代码以使其可行 ; 不是每个用户都加载,一次最多加载10个。

    非常感谢您的任何建议、资源和链接。

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

     ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}")
            .observe(.childAdded, with: { snapshot in
                print(snapshot.key)
            })
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Jay    8 年前

    有很多解决方案,加载所有用户数据往往会导致数据过多。

    这是一个典型的用户节点

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

        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)
            }
        })
    

    上面查询中使用的\uf8ff字符是一个非常高的代码点 在Unicode范围内。因为它位于

    推荐文章