【问题标题】:Angularfire append data to array in database without data keyAngularfire在没有数据键的情况下将数据附加到数据库中的数组
【发布时间】:2015-10-01 00:52:59
【问题描述】:

我正在尝试使用如下所示的数据模型向房间/用户添加一些内容:

rooms: {
    name: roomname
    users: {
        0: email@email.com
    }
}

我的问题是是否有任何方法可以将新项目附加到用户数组。我通常会使用 update() 来执行此操作,但是当我只想将数据设置为下一个数组索引时,update() 需要一个键来设置数据。我想我可以通过获取当前的房间/用户数组,在本地附加它,并使用 set() 覆盖它来做到这一点,但我想知道是否有更好的(内置)方法来解决这个问题。

【问题讨论】:

  • Firebase 的文档很好地涵盖了您的上一个问题和这个问题。我建议从 AngularFire 文档 (firebase.com/docs/web/libraries/angular) 开始,然后浏览常规网络文档 (firebase.com/docs/web/guide) 以确保完整性。
  • @FrankvanPuffelen 再次感谢。我从未阅读过完整的文档,只阅读了“快速入门”指南,并且仅在我寻找某些东西时才查看文档。我现在一定会仔细阅读它们。

标签: firebase angularfire


【解决方案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,我从中复制了上面的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 2018-08-06
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多