2017-07-28 30 views
0

假設我在「post」中有10000個孩子,每個節點都包含孩子的「用戶名」。如果「userA」在10000個數據中添加6000。我怎麼能在每個節點更新「用戶A」的「後」Firebase更新了很多孩子的價值

firebase

+0

你的結構你不能這樣做。 –

+0

是否要將用戶名從「userA」更改爲另一個用戶名? – faruk

+0

謝謝@ J.Doe您可以爲此提供示例結構嗎? – LIPONEF

回答

1

火力地堡如果NOSQL模式,你不能把它應用直接查詢。您需要對所有節點應用迭代,並在用戶名爲「userA」時更新。

+0

Thanks @Usman您能否舉一些例子來說明目的? – LIPONEF

+0

@LIPONEF示例代碼在下面的一些答案中發佈,您可以根據自己的需要修改它們。 –

2

您需要知道所有用戶帖子。

你需要這樣的結構:

root 
| 
+-- posts 
|  | 
|  +-- $postId 
|   | 
|   +-- text: $text 
|   | 
|   +-- username: $username 
| 
+-- userPosts 
|  | 
|  +-- $userId 
|   | 
|   +-- $postId: true 

採用這種結構可以檢索的所有帖子的ID爲用戶和更新帖子。

+0

謝謝皮皮克斯,如果我把UID而不是用戶名。當我查詢每個帖子時,我得到的UID從另一個節點查詢用戶名(例如root-> users-> uid-> username =「userA」)。比較你的給定結構哪一個更好,因爲有人告訴我,我給出的例子可能會浪費你的Firebase流量成本。 – LIPONEF

+0

你不必改變你的帖子結構只是添加userPosts或做像'postsRef.orderByChild(「用戶名」)。equalsTo(「userA」)'像'在@jorge回答 – Pipiks

+0

@Pipiks在請求數據,你應該把userId也..我叫它在nosql中的定向關係 – faruk

0

如果你想從helloA更改文本你好我是一個,例如,代碼是這樣的:

DatabaseReference postReference = FirebaseDatabase.getInstance().getReference("posts"); 

    postReference.orderByChild("username").equalsTo("userA") 
      .addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.exists()) 
         for (DataSnapshot data : dataSnapshot.getChildren()) { 
          data.getRef().child("text").setValue("hello I'm A"); 

所以,你有一個dataSnapshot與每一個崗位與用戶名等於用戶A你可以迭代它並更改這些帖子

0

問題是關於更新字段用戶名。 我的建議是爲更新值創建臨時哈希映射。所以它只會更新所有帖子一次。

訣竅是,更新節點的孩子時,你可以把「the_key」用斜槓「/」加上你要更新,在這種情況下,該領域「用戶名」

DatabaseReference postDbRef = FirebaseDatabase.getInstance().getReference("posts"); 

Map<String, Object> updateValues = new HashMap<String, Object>(); 
String oldUserName = "userA"; 
String newUserName = "userA new"; 

postDbRef.orderByChild("username") 
    .equalTo(oldUserName) 
    .addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (dataSnapshot.exists()){ 
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
         updateValues.put(childSnapshot.getKey()+"/username", newUsername); 
        } 

        postDbRef.updateChildren(updateValues); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
    }); 
; 

爲了提高性能,我建議在數據庫規則中添加「.indexOn」。像這樣:

"posts": { 
    ".indexOn": ["username"] 
},