我正在尝试使用如下所示的数据模型向房间/用户添加内容:
rooms: {
name: roomname
users: {
0: email@email.com
}
}
我的问题是,是否有任何方法可以将新项目附加到users数组。我通常会使用update()来执行此操作,但是当我只想将数据设置为下一个数组索引时,update()需要将数据键设置为。我想我可以通过获取当前的房间/用户数组,在本地附加它,并使用set()覆盖它来实现这一点,但我想知道是否有更好的(内置)方式来解决这个问题。 / p>
答案 0 :(得分:1)
在Firebase等潜在的大规模分布式系统中使用数组通常是一个坏主意。根据您的描述,您的用例属于“一般”类别。
来自Firebase documentation on arrays:
为什么不提供全阵列支持?由于数组索引不是永久性的,唯一ID,并发实时编辑将始终存在问题。
例如,考虑三个用户是否同时更新了远程服务上的阵列。如果用户A尝试更改密钥2处的值,则用户B尝试移动它,并且用户C尝试更改它,结果可能是灾难性的。例如,在许多其他可能失败的方式中,这里有一个:
// starting data
['a', 'b', 'c', 'd', 'e']
// record at key 2 moved to position 5 by user A
// record at key 2 is removed by user B
// record at key 2 is updated by user C to foo
// what ideally should have happened
['a', 'b', 'd', 'e']
// what actually happened
['a', 'c', 'foo', 'b']
Firebase使用称为“推送ID”的概念,而不是使用数组。这些一直在增加(如数组索引),但(与数组索引不同),您不必知道添加新推送ID的当前计数。
使用推送ID,您可以添加新用户:
var ref = new Firebase('https://yours.firebaseio.com/rooms/users');
ref.push('email@email.com');
请注意,Firebase文档通常被认为非常好。我强烈建议您至少遵循我复制上述内容的programming guide for JavaScript。