2016-04-01 54 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

輝煌的回答朋友..歡呼聲 –