2016-04-01 56 views

回答

2

不,但有点儿。

你不能做通配符查询,但是,你可以构造你的数据,这将允许这个。

例如,假设我们要找到用户的名字匹配与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

+2

这是一个有趣的方式来实现我所需要的。唯一的问题是我需要为名称的任何部分做一个通配符(例如* roy *)。另外,我将在我的db中拥有〜20万人。它会缩放吗? – MoreScratch

+0

它可以扩展,但(Firebase是可扩展的),对于那个数据集的大小来说可能不太现实。如果您只是在寻找类似自动填充的内容,您可以在其中键入前几个字的名称,姓氏,那么它更实际。我们制作了一个ObjC类,我们可以将它命名为名称,并将名称分解为所有可搜索的组合,然后将其存储在Firebase节点中;这感觉非常自动化,但我们还没有尝试使用数千个名称。这对于Firebase团队来说可能是个好问题。 – Jay

+1

想象一下,你想在你的数据库的所有字符串字段中进行通配符搜索,在N个组合中分解每个字段的每个值是不切实际的 – Oswaldo

-2

由于火力地堡不支持通配符搜索我决定和Apigee BaaS一起去我们公司。

+3

问题的答案如何? – mamu

+0

我需要关闭问题的循环。我很清楚,Firebase中不存在解决方案,因此我们决定只更换我们的BaaS提供商。实质上,根据文档和对问题的回答,我们无法得到答案。 – MoreScratch

+0

你没有提供解释你的问题的解释,或者它真的回答你的问题。 – Learn2Code

6

我知道这已经有一段时间了,但我认为别人可能会感兴趣。您可以“伪造”通配符搜索,如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开头的所有值。

+0

辉煌的回答朋友..欢呼声 –