高效查询firebase

问题描述 投票:0回答:1

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

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

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

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

编辑:

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

 ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}")
        .observe(.childAdded, with: { snapshot in
            print(snapshot.key)
        })
ios swift firebase firebase-realtime-database firebase-storage
1个回答
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 开头的值。

编辑:2024-06

You may need to use "\u{F8FF}" instead of "\\uf8ff"
© www.soinside.com 2019 - 2024. All rights reserved.