2016-12-28 5 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" 
     } 
    }, 
} 

私は何をしたいことは、その値が58ewgsg656fdでそのtagsに子を含めるusers内のノードを取得している:私はこのようになります構造を有しています。

この例では、それは"blue": "58ewgsg656fd"子であろうと、それらを含有usersノードは、2つ(...0R-5...BRhs)その構造内の1つの最後です。私はそれらのノードを取得するために書くべき

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

これは、多数のユーザーをダウンロードするための他の方法と同様に拡張性があります。ここでの主な制限はインターネットです。 bandwidth - ダウンロードされたバイト数。スループットを向上させるには、データを少しずつダウンロードします。 – Kato

関連する問題