代码之家  ›  专栏  ›  技术社区  ›  miles_b

Firebase实时数据库-间歇更新()的工作原理与set()类似

  •  0
  • miles_b  · 技术社区  · 7 年前

    update() 函数的工作方式与 set() 功能。有趣的是,它似乎发生在大约1%的更新操作上。但是我们已经执行了大量的日志记录,并且会看到一些事情发生,比如某个特定的更新被推送到一个循环内的一组用户,我们验证日志中是否向所有用户发送了正确的信息,并且 在每个记录上都被调用。然而,我们将看到的结果是,有时其中一个用户最终得到的记录只包含我们更新的字段,而记录中的所有其他字段都将被删除,而所有其他用户都会正确地接收更新。完全一样 更新()

    尝试多次重复测试update()函数。目前还没有确定的方法可以导致此问题再次出现,但它在生产中是随机发生的。

    const contactsRef = admin.database().ref().child('contacts');
    ...
    //targetUID, contactID, contactObj get passed in via PubSub
    ...
    contactsRef.child(targetUID).child(contactID).update(contactObj);
    

    更新() 只应更新传递给它的记录字段。

    更新() 设置() 更新()

    1 回复  |  直到 7 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    对于1%的用户来说,数据库服务器的行为似乎不太可能有所不同。更有可能的是,你的1%的用户所拨打的电话略有不同。很难确定与您共享的代码有什么区别,所以下面是一个有根据的猜测,希望能尽快解除您的封锁。

    contactsRef.child(targetUID).child(contactID).update(contactObj);
    

    预期: update()

    这有点微妙,不幸的是你没有展示你是如何构建的 contactObj . 所以我举个例子。假设您从JSON开始:

    "uid1": {
      "name": "unknown",
      "id": -1,
      "full_name": "unknown",
      "metadata": {
        "last_seen": "20 minutes ago",
        "reputation" 56
      }
    }
    

    你在那个地方运行这个:

    ref.update{
      "name": "miles_b",
      "id": 2687721
    }
    

    name id ref

    "uid1": {
      "name": "miles_b",
      "id": 2687721,
      "full_name": "unknown",
      "metadata": {
        "last_seen": "20 minutes ago",
        "reputation" 56
      }
    }
    

    但是现在说你还想更新 metadata/reputation . 你可能认为这是可行的:

    ref.update{
      "name": "miles_b",
      "id": 2687721,
      "metadata": {
        "reputation": 61
      }
    }
    

    metadata 用你提供的对象。所以结果是:

    "uid1": {
      "name": "miles_b",
      "id": 2687721,
      "full_name": "unknown",
      "metadata": {
        "reputation" 61
      }
    }
    

    这意味着 last_seen

    要更新嵌套属性,请在键中包含其完整路径。所以:

    ref.update{
      "name": "miles_b",
      "id": 2687721,
      "metadata/reputation": 61
    }
    

    有了这些,你就可以 metadata/last_seen ,更新时 元数据/信誉 :

    "uid1": {
      "name": "miles_b",
      "id": 2687721,
      "full_name": "unknown",
      "metadata": {
        "last_seen": "20 minutes ago",
        "reputation" 61
      }
    }
    
    推荐文章