2016-12-28 66 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

相关问题