2016-02-24 132 views
3

此問題是關於實施Firebase深層查詢。考慮火力的結構如下:Firebase深層查詢

enter image description here

在這裏,我的裁判指向是/messages結構的根。所以,我有:

var ref = new Firebase("https://cofounder.firebaseio.com/messages"); 

我想查詢有member = -752163252標識的那些消息。所以基本上返回的對象應該是帶有密鑰655974744的那個。我如何着手在Firebase中做這件事?

這是我在我的控制檯嘗試:

ref.orderByChild("members").equalTo(235642888).on('value', function(snap){console.log("Found ",snap.val())}); 

結果爲:

VM837:2 Found null 

我感覺到有什麼地方一個缺失的環節。基本上,我想知道是否有任何方法來查詢深層嵌套的數據,而沒有父鍵ID(在本例中爲25487894,655974744)。

另外,如果我可以擴展我的問題,是否有一種方法來添加一個偵聽器,當添加一個新的messageId(在本例中爲25487894,655974744)時會回調,其中包含member = -752163252

希望我的問題很清楚。任何幫助是極大的讚賞!

編輯:

我已經看了看恐龍例子,這就是我試了一下我試過,但沒有奏效。

+0

您已經在您的問題中包含了JSON樹的圖片。請將實際的JSON替換爲文本,您可以通過點擊Firebase數據庫中的導出按鈕輕鬆獲取該文本。將JSON作爲文本可以搜索,使我們能夠輕鬆使用它來測試您的實際數據,並將其用於我們的答案中,並且通常只是一件好事。 –

+0

@FrankvanPuffelen謝謝你提到它。對不起,我會牢記這一點。 –

回答

9

您的查詢聲稱「members」節點是值爲235642888的整數,當然這不是。它是一個包含鍵列表的對象。

相反,你會想用deep child query語法和類似如下:

ref.orderByChild("members/235642888").equalTo(235642888); 

注意,你並不真正需要的關鍵價值是關鍵本身。您可以通過將此設置爲二進制true1來節省存儲空間。該查詢將大致相同:

ref.orderByChild("members/235642888").equalTo(true); 
-1

問題是你的數據結構不是你的查詢。你不想讓你的鑰匙和價值成爲同一件事。發生了什麼事是你正在尋找成員= XXX罰款,但成員是成員[xxx] = xxx字典。您應該可以在成員中存儲數組,然後搜索members.value是否包含您正在查找的成員。

+2

您無法根據Firebase中的任何「包含」進行查詢。 – Kato

+0

嗯,我明白了。我仍然說現在的結構可以改進而不是適應查詢。 – Jeremiah