Firebase上的通配符查询?

Mor*_*tch 10 firebase firebase-realtime-database

是否可以在Firebase上进行通配符查询?例如:

https://foo.firebaseio.com/person.json?orderBy="name"&equalTo="Lun*"
Run Code Online (Sandbox Code Playgroud)

Mih*_*atu 9

我知道已经有一段时间但我认为其他人可能会感兴趣.您可以"伪造"通配符搜索foo*(例如,基本上您可以搜索以指定字符串开头的值).

对于iOS和Swift,它看起来像这样:

dbReference.child("person").queryOrdered(byChild: "name").queryStarting(atValue: "foo").queryEnding(atValue: "foo\u{f8ff}").observe(.childAdded) { (snapshot: FIRDataSnapshot) in
    print("\(snapshot.key) - \(String(describing: snapshot.value))")
}
Run Code Online (Sandbox Code Playgroud)

这样做是使用name结束键等于Unicode范围内的开始+非常高的代码点的属性的开始和结束值.因为它在Unicode之后的大多数常规字符之后,所以查询匹配以所有开头的值foo.


Jay*_*Jay 4

不,但是有点。

您无法执行通配符查询,但是,您可以构建允许这样做的数据。

例如,假设我们要查找名称以 Ler 开头的用户的匹配项

这是我们的结构

users
  uid_0
    name: "Leroy"
Run Code Online (Sandbox Code Playgroud)

将分解的数据存储在另一个节点中:记住,磁盘空间很便宜。

decomposed
  uid_0
    L: true
    Le: true
    Ler: true
    Lero: true
    Leroy: true
Run Code Online (Sandbox Code Playgroud)

然后在分解节点上查询等于 Ler 的子节点的 true 值

ref.queryOrderedByChild("Ler").queryEqualToValue(true).observeEventType(.ChildAdded, 
     withBlock: { snapshot in
                    print(snapshot.key)
                })
Run Code Online (Sandbox Code Playgroud)

snapshot.key 将为 uid_0

  • 这是实现我所需要的一种有趣的方式。唯一的问题是我需要对名称的任何部分使用通配符(例如 *roy*)。另外,我的数据库中将有大约 20 万人。它会规模化吗? (2认同)