【问题标题】:Is There Such A Thing As "Multi-Path Push" in Firebase Real-Time Datasbase?Firebase 实时数据库中是否存在“多路径推送”之类的东西?
【发布时间】:2023-04-07 09:30:02
【问题描述】:

我在看 this video,它谈到了 Firebase 中的多路径更新。多路径更新很棒,因为它们允许您调用 firebaseRef.update() 方法两次或多次,同时让它们成为一个原子的、全有或全无的操作。

这很好,但在我目前的情况下,我不想使用 update() 方法。相反,我想使用 FirebaseRef 的 push 方法并允许 Firebase 为我的对象生成唯一键。

棘手的部分是我对数据进行了非规范化处理,使其位于两个位置。我真正想做的是有一个原子的、全有或全无的操作,它使用 Firebase 的 push() 操作来创建一个唯一键,然后使用该键将对象保存在 2 个或多个不同的放在我的数据库数据中。但是, push() 的语法已经使用了一个对象,所以我想要做的甚至可能吗?

注意:另一种可能的解决方案可能是使用 Firebase api 在客户端以某种方式生成唯一密钥,然后使用生成的密钥作为要插入的对象的密钥进行标准多路径更新。

【问题讨论】:

  • 您最后注意到的是您问题的答案。 var key = firebase.database().ref('somestring').push();将返回一个密钥,而无需在 firebase 数据库中写入任何内容。使用该键创建您的对象,然后调用 update()
  • 但是假设用户在第一次通过之后和第二次通过之前离开了应用程序。然后我的非规范化数据处于不一致状态。我想在一个原子操作中完成所有操作。
  • 然后使用 transaction() 它是为此目的而构建的。但根据我个人的观点,只有在确实需要时才使用交易。
  • 事务在这种情况下将不起作用。如果您认为确实如此,请发布答案。

标签: angular firebase firebase-realtime-database angularfire2 nosql


【解决方案1】:

没有多地推送,但是因为推送ID是在客户端生成的,所以你可以使用多地更新来做你想做的事。

您可以通过不带参数调用push 来生成推送ID。推送 ID 在客户端生成,生成一个不涉及与数据库的交互:

let key = firebase.database().ref().push().key;

您也可以使用 AngularFire2 来执行此操作;不过,您必须将参数 (undefined) 传递给 push 以安抚 TypeScript:

let key = angularFire.database.list('').push(undefined).key;

生成密钥后,您可以创建多位置更新:

let obj = { some: 'object' };
angularFire.database.object('').update({
    [`a/path/${key}`]: obj,
    [`another/path${key}`]: obj
});

更新是原子的,所以要么更新所有路径,要么不更新。

【讨论】:

  • 太棒了。使用不带参数的 push 是关键! (没有双关语,呵呵)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
相关资源
最近更新 更多