2014-11-25 42 views
12

我有一首歌曲的名称,我为其节省了额定值。 它看起来像波纹管,因为我使用push()来存储每个新的评级。在Firebase中存储阵列值的正确方法

data example

但我想看到的是,ratings为 对象,每个都包含像这样的数组:

voter: { 
    ip: "1.1.1.1", 
    stars: 3, 
} 

所以rating键将结束是这样的:

rating: [{ip: "1.1.1.1", stars: 3}, ...] 

然后我可以启用每个IP地址只有一个投票。我在 Firebase文档中找不到的是如何添加到现有密钥,在这种情况下rating(但它会是[list,like]) - 新的hash像上面那样。 由于push()会自动创建hash-key值,并且我想将 附加到现有密钥。

编辑: 我知道的事实,即火力地堡不存储阵列本身,但是在这种情况下,它并不重要,这是我多么想看看我的数据。

回答

14

您当前正在使用push添加新的子项,该子项会自动为新增节点命名,该节点“保证”在多个客户端中是唯一的。

ref.push({ ip: userIP, stars: userStars }); 

Firebase的push方法是让多个客户端将项目添加到有序集合的好方法。如果你想用数组完成同样的操作,你必须同步客户端之间的数组长度。 Firebase的名称生成不需要这种开销,所以通常是保持跨多个客户端的订单收集的首选。

但在你的情况下,你似乎并不想要一个有序的“仅追加”集合。看起来你认为IP地址是每个节点的标识。在这种情况下,我会使用IP地址作为节点名的基础:

votes 
    "1.1.1.1": 3 
    "1.2.3.4": 5 
    "1.7.4.7": 2 

你会与实现这一点:

ref.child(userIP).set(userStars); 

如果你想随后读取所有票到一个数组,你可以这样做:

var votes = []; 
votesRef.on('value', function(snapshot) { 
    snapshot.forEach(function(vote) { 
     votes.push({ ip: vote.key(), stars: vote.val() }); 
    }); 
    alert('There are '+votes.length+' votes'); 
}) 
+0

谢谢!我有同样的问题,这对我有效。 – KaoriYui 2017-07-07 11:14:14

0

我想创建可重复使用的函数来添加/保存根节点(即使其具有数据数组在对象内的任何电平)下的任何物体。所以我想出了这个。(我不知道是否符合最佳实践,但它的工作相当顺利)

SaveWholeData: function(sKey, oVal, bGenKey) { 
     bGenKey = bGenKey === undefined ? true: bGenKey; 
     var oOriginalProperty = angular.copy(oVal); 
     for (var property in oVal) { 
      if (oVal.hasOwnProperty(property) && oVal[property] instanceof Array) { 
       console.log(property); 
       oVal[property] = "$|$"; 
      } 
     } 
     var sOwnRef = SaveDataByKey(sKey, oVal, bGenKey); 
     for (var property in oVal) { 
      if (oVal.hasOwnProperty(property) && oVal[property] === "$|$") { 
       oVal[property] = oOriginalProperty[property]; 
       var updatedReference = sOwnRef + "/" + property; 
       SaveWholeData(updatedReference, oVal[property], false); 
      } 
     } 
     return true; 
    }, 
    SaveDataByKey: function(sKey, oVal, bGenKey) { 
     if (bGenKey) { 
      var newPostKey = firebase.database().ref(sKey).push().key; 
      oVal.genKey = newPostKey; 
      firebase.database().ref(sKey).child(newPostKey).set(oVal); 
      return sKey + "/" + newPostKey; 
     }else{ 
      firebase.database().ref(sKey).set(oVal); 
      return sKey; 
     } 
    } 

所以要添加新用户下根users,您拨打:

SaveWholeData("users", oUserInfo, true); 

更新现有用户

SaveWholeData("users"+"/"+ oUserInfo.genKey, oUserInfo, true);