【问题标题】:querying firebase efficiently有效地查询firebase
【发布时间】:2017-12-21 07:50:11
【问题描述】:

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

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

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

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

编辑:

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

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

【问题讨论】:

  • 1) 你的问题太宽泛了。 2)展示你的尝试。 3)你所有的问题都很容易用谷歌搜索。 gl
  • @VladPulichev 我稍微编辑了这个问题。另外,如果您能指出任何很棒的资源。

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


【解决方案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 开头的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2016-12-25
    相关资源
    最近更新 更多