2016-12-28 103 views
0

對於Firebase,我仍然很新,但仍然在學習如何使用它進行「簡單」操作。我有一個看起來像這樣的結構:包含具有特定值的子對象的節點

"users": { 
    "-KY5FJBudXmKv07noYbZ": { 
     "emailAddress" : "[email protected]", 
     "tags": { 
      "red": "8dfhj34sd983ie", 
      "green": "9f5d6g8er2d" 
     } 
    }, 
    "-KY5JM-NGjNgUXwrBRhs": { 
     "emailAddress": "[email protected]", 
     "tags": { 
      "blue": "58ewgsg656fd", 
      "pink": "sdf6g3dg5e6d" 
     } 
    }, 
    "-K_0c7wslBiOceF30R-5": { 
     "emailAddress": "[email protected]", 
     "tags": { 
      "blue": "58ewgsg656fd", 
      "brown": "xx4f5g68d5d1", 
      "black": "8941gs8536sdf1" 
     } 
    }, 
} 

我想要做的就是內users包含在孩子獲取節點的tags其中該值是58ewgsg656fd

在這個例子中,這將是"blue": "58ewgsg656fd"孩子和包含它們的users節點是最後兩個(...0R-5...BRhs)一個在該結構中。

這是我到目前爲止有:

DatabaseReference usersRef = database.getReference("users"); 
usersRef.orderByChild("tags").[NOT SURE WHAT GOES HERE].addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.getChildrenCount() == 0) { 
      // No users found with that tag 
     } else { 
      // Users found with that tag 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     // Error occurred 
    } 
}); 

我應該寫什麼代碼來獲取這些節點?

+0

你應該嘗試顛倒標籤的鍵值對的順序。那麼它會更容易 –

+0

所以說我做到了這一點,我將如何去「關鍵」而不是「價值」查詢? – Brian

+1

即使您反轉鍵和值(或者添加具有反轉鍵/值的其他子節點),這仍然是一個困難的查詢,因爲您需要爲所有值定義索引。在這種情況下,最好添加從值到路徑的頂級查找列表映射。在這裏看到我的答案:http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –

回答

1
ArrayList<String> user=new ArrayList<>(); 
DatabaseReference usersRef=FirebaseDatabse.getInstance().getReference(); 
usersRef.child("users").addValueEventListener(new ValueEventListener() 
{ 
public void onDataChange(DataSnapshot dataSnapshot) { 
      Iterator<DataSnapshot>iterator=dataSnapshot.getChildren().iterator(); 
while(iterator.hasNext()) 
{ 
DataSnapshot snapshot=iterator.next(); 
if(snapshot.child("tags").child("58ewgsg656fd").exists()) 
{ 
user.add(snapshot.getKey()); 
} 
} 

} 

@Override 
public void onCancelled(DatabaseError databaseError) { 

     } 
}); 
+1

這可以工作,但看起來不可擴展。如果我有成千上萬的用戶,那麼這是否涉及遍歷所有用戶,並且可能導致應用客戶端通過所有用戶數據「下載」,以便在最壞的情況下迭代通過這個? – Brian

+0

是的,它對於大量的用戶來說不是可擴展的,但是直到現在,我已經能夠弄清楚只獲取期望的響應數據。 –

+1

它可以像其他任何下載大量用戶的方法一樣進行擴展。這裏主要的限制是互聯網 - 也就是說,帶寬 - 以及正在下載的字節數。要提高吞吐量,請下載較少的數據。 – Kato

相關問題