【问题标题】:Firebase - Update specific fields simultaneously without replacing all of the dataFirebase - 同时更新特定字段而不替换所有数据
【发布时间】:2018-09-28 23:02:16
【问题描述】:

我希望能够在我的 Firebase 数据库的两个目录中同时发布。根据Firebase Javascript documentation 的“更新特定字段”部分中提出的示例,我为此创建了一个函数:

  function linkTwoUsers(user1, user2) {

    // The two users are "connected".

    var user1Data = {
        userLink: user2
    };
    var user2Data = {
        userLink: user1
    };

    var updates = {};
    updates["/users/" + user1] = user1Data;
    updates["/users/" + user2] = user2Data;

    return database
      .ref()
      .update(updates)
      .then(() => {
        return res.status(200).end();
      })
      .catch(error => {
        return res.status(500).send("Error: " + error.message);
      });
  }

问题在于,当我运行该函数时,它不是上传目录,而是替换其中存在的所有数据。

这里是函数之前的用户目录:

然后:

我们如何确保数据不会覆盖其他数据?感谢您的帮助。

【问题讨论】:

  • 你得到这个对象数据结构更新文件的解决方案了吗

标签: javascript json firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

尝试将路径缩小到您尝试更新的属性:

updates["/users/" + user1 + "/userLink/"] = user1;
updates["/users/" + user2 + "/userLink/"] = user2;

【讨论】:

    【解决方案2】:

    当您设置时,好像您正在创建一个全新的对象:

     var userData = { someThing: stuff }
    

    当你传入它时,它将覆盖原始对象。您可以解决此问题的一种方法(可能有更有效的方法)是从 Firebase 获取对象,将新属性和值添加到对象,然后将整个对象发送回 Firebase。

    在一些 javascript 框架中,您应该能够使用 spread operator 将一个对象的所有道具设置为另一个对象,如下所示:

     var newObject = { ...originalObject }
     newObject.userData = "something"
     // then save newObject to firebase
    

    【讨论】:

    • 我确实想过这个解决方案。我用的是 Firebase Function,你觉得兼容吗?
    • 这并不是执行多位置更新的最有效方式,因为您必须先读后写。如果你只是想写,只在你的多位置更新中指明你想更新的特定字段。 Stradopshere 的回答表明了这一点。
    • 我无法评论 Stradosphere 的回答,但它确实是执行此任务的有效方式。
    猜你喜欢
    • 2019-03-29
    • 2017-11-30
    • 2021-12-01
    • 2016-11-24
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多