2017-08-05 83 views
0

我想篩選Firebase中的數據。我有一些疑問,但我無法按照我的要求過濾數據。

數據:在Firebase中過濾數據(使用複雜查詢)android

{ 
    "messages": { 
    "Data_1": { 
     "Inner_3": { 
     "Text": { 
      "-Kqgd2_QSi5HIlyH6Om3": { 
      "date": 1501840029764, 
      "text": "hi" 
      }, 
      "-Kqgd6zZf51AdKNPrsX8": { 
      "date": 1501840047829, 
      "text": "hello" 
      } 
     } 
     } 
    }, 
    "Data_2": { 
     "Inner_2": { 
     "Text": { 
      "-Kqm5GijxFT54wZRHIJj": { 
      "date": 1.501931572192E9, 
      "text": "hi" 
      }, 
      "-Kqm5YohOG1cFWO-WNGc": { 
      "date": 1.501931646257E9, 
      "text": "test" 
      }, 
      "-Kqm6935IY8Ddj20Z3TN": { 
      "date": 1.501931802871E9, 
      "text": "new message" 
      } 
     } 
     } 
    } 
    } 
} 

在上面的JSON,如果我通過Inner_3然後應該返回下面的結果。它檢查所有arrays是否有Inner_3可用,然後給我主層名稱和最後TEXTInner_3

{ 
    "messages": { 
    "Data_1": { 
     "Text": { 
     "-Kqgd6zZf51AdKNPrsX8": { 
      "date": 1501840047829, 
      "text": "hello" 
     } 
     } 
    } 
    } 
} 

請幫我實現這個結果。

回答

1

不幸的是那種查詢是不可能的火力地堡數據庫。你將不得不改變你的數據結構來適應它。

一種方法是將Inner_3添加爲已知屬性的值:

ref.child("messages").orderByChild("Key").equalTo("Inner_3") 

另外,您可以添加一個單獨的查詢列表:

{ 
    "messages": { 
    "Data_1": { 
     "Key": "Inner_3" 
     "Inner_3": { 
     "Text": { 
      "-Kqgd2_QSi5HIlyH6Om3": { "date": 1501840029764, "text": "hi" }, 
      "-Kqgd6zZf51AdKNPrsX8": { "date": 1501840047829, "text": "hello" } 
     } 
     } 
    }, 
    "Data_2": { 
     "Key": "Inner_2" 
     "Inner_2": { 
     "Text": { 
      "-Kqm5GijxFT54wZRHIJj": { "date": 1.501931572192E9, "text": "hi" }, 
      "-Kqm5YohOG1cFWO-WNGc": { "date": 1.501931646257E9, "text": "test" }, 
      "-Kqm6935IY8Ddj20Z3TN": { "date": 1.501931802871E9, "text": "new message" } 
     } 
     } 
    } 
    } 
} 

現在你可以查詢

"InnerToNodeNameMapping": { 
    "Inner_3": "Data_1", 
    "Inner_2": "Data_2" 
} 

然後,您可以找到Inner_3項目的路徑直接查詢:

ref.child("InnerToNodeNameMapping").child("Inner_3") 

並從中可以直接訪問節點(無需查詢)。

必須調整/擴展您的數據結構以允許您的應用中需要的用例在Firebase和其他NoSQL數據庫中非常常見。由於您對NoSQL看起來相對較新,所以我推薦閱讀NoSQL data modeling

+0

非常感謝。如果Data_2包含Inner_2和Inner_3兩者,該怎麼辦?那麼,我應該在Key中使用什麼? –

+0

這變成了一個分類問題。在這裏看到我更長的答案:http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –

+0

根據您的鏈接建議,我創建了不同的頻道列表。 –

0

您必須按鍵.orderByKey()進行排序,並獲得lastone,rember firebase推送的密鑰是包含時間戳的隨機字符串。

最常見的排序方法是ref.orderByKey()。它通過按鍵命令裁判的孩子,通常按下按鍵 - 按時間排序。

你有你的快照通過鍵排序後,你可以做這樣的事情:

var firstdata; 
snapshot.forEach(function(mySnapshot) { 
    if (!firstdata) { 
    firstdata = mySnapshot.val(); 
    } 
    }); 
    console.log(firstdata); 
+0

'.orderByKey()'很好,但主要問題是從所有上層找到'Inner_3'。 –

+1

我已經在做這個。但是如果我有10000條消息,那麼我認爲獲取所有數據並過濾它是不好的選擇。 –

+0

據我所知,firebase沒有被認爲這樣做,唯一的解決方法是循環每個元素並獲得最後一個,或將按鍵存儲在像/ times這樣的路徑中,然後從那裏檢索最後一個鍵和路徑它存儲文本的位置。 –