在Firebase中存储类似数组值的正确方法

bra*_*ito 13 arrays firebase

我有一首歌的名字,我为它节省了评分.它看起来像下面的图片,因为我push()用来存储每个新的评级.

数据示例

但我想看到的是,ratings作为一个对象数组,每个包含这样的东西:

voter: {
    ip: "1.1.1.1",
    stars: 3,
}
Run Code Online (Sandbox Code Playgroud)

所以rating关键最终会是这样的:

rating: [{ip: "1.1.1.1", stars: 3}, ...]
Run Code Online (Sandbox Code Playgroud)

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

编辑: 我知道 Firebase本身不存储数组这一事实,但在这种情况下无关紧要,这就是我想看到我的数据的方式.

Fra*_*len 14

您当前正在使用push添加新子项,这会自动为新节点生成一个名称,该名称在多个客户端中"保证"是唯一的.

ref.push({ ip: userIP, stars: userStars });
Run Code Online (Sandbox Code Playgroud)

Firebase的push方法是让多个客户将项目添加到有序集合的好方法.如果要使用数组完成相同的操作,则必须在客户端之间同步数组的长度.Firebase的名称生成不需要这样的开销,因此通常是在多个客户端之间保留订单集合的首选.

但在你的情况下,你似乎不想要一个有序的"仅附加"集合.您似乎认为IP地址是每个节点的标识.在这种情况下,我将使用IP地址作为节点名称的基础:

votes
  "1.1.1.1": 3
  "1.2.3.4": 5
  "1.7.4.7": 2
Run Code Online (Sandbox Code Playgroud)

你可以用以下方法完成

ref.child(userIP).set(userStars);
Run Code Online (Sandbox Code Playgroud)

如果您想随后将所有投票读入数组,您可以执行以下操作:

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');
})
Run Code Online (Sandbox Code Playgroud)