是否可以在Firebase上进行通配符查询?例如:Firebase上的通配符查询?
https://foo.firebaseio.com/person.json?orderBy="name"&equalTo="Lun*"
是否可以在Firebase上进行通配符查询?例如:Firebase上的通配符查询?
https://foo.firebaseio.com/person.json?orderBy="name"&equalTo="Lun*"
不,但有点儿。
你不能做通配符查询,但是,你可以构造你的数据,这将允许这个。
例如,假设我们要找到用户的名字匹配与Ler的
开始这是我们的结构
users
uid_0
name: "Leroy"
商店中的另一个节点分解数据:请记住,磁盘空间很便宜。
decomposed
uid_0
L: true
Le: true
Ler: true
Lero: true
Leroy: true
然后分解节点上执行一个查询,真正为孩子的价值等于LER
ref.queryOrderedByChild("Ler").queryEqualToValue(true).observeEventType(.ChildAdded,
withBlock: { snapshot in
print(snapshot.key)
})
而且snapshot.key将uid_0
由于火力地堡不支持通配符搜索我决定和Apigee BaaS一起去我们公司。
问题的答案如何? – mamu
我需要关闭问题的循环。我很清楚,Firebase中不存在解决方案,因此我们决定只更换我们的BaaS提供商。实质上,根据文档和对问题的回答,我们无法得到答案。 – MoreScratch
你没有提供解释你的问题的解释,或者它真的回答你的问题。 – Learn2Code
我知道这已经有一段时间了,但我认为别人可能会感兴趣。您可以“伪造”通配符搜索,如foo*
(因此基本上可以搜索以指定字符串开头的值)。
对于iOS &斯威夫特它应该是这样的:
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))")
}
这样做是使用的开始和结束值name
财产哪里结束键等于启动+非常高的代码点Unicode范围。因为它在Unicode中的大多数常规字符之后,查询将匹配以foo
开头的所有值。
辉煌的回答朋友..欢呼声 –
这是一个有趣的方式来实现我所需要的。唯一的问题是我需要为名称的任何部分做一个通配符(例如* roy *)。另外,我将在我的db中拥有〜20万人。它会缩放吗? – MoreScratch
它可以扩展,但(Firebase是可扩展的),对于那个数据集的大小来说可能不太现实。如果您只是在寻找类似自动填充的内容,您可以在其中键入前几个字的名称,姓氏,那么它更实际。我们制作了一个ObjC类,我们可以将它命名为名称,并将名称分解为所有可搜索的组合,然后将其存储在Firebase节点中;这感觉非常自动化,但我们还没有尝试使用数千个名称。这对于Firebase团队来说可能是个好问题。 – Jay
想象一下,你想在你的数据库的所有字符串字段中进行通配符搜索,在N个组合中分解每个字段的每个值是不切实际的 – Oswaldo