Cloud Firestore - 确保数据一致性

时间:2018-01-12 11:35:47

标签: firebase google-cloud-firestore

我的数据库使用冗余数据来加速提取并最大限度地减少某些查询需要读取的文档数量。例如,我将跟踪用户的名称存储在用户文档的地图中,因此我不必阅读其他文档来检索每个被跟踪用户的名称。

User: (Collection) {
    userID: (Document) {

    //user state
    name: ...

    followingUsers: (Map) {
        followingUserID: nameOfUser,
        followingUserID: nameOfUser
    }
}

}

如果用户要更改其名称,使用冗余数据将这些更改传播到所有位置的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

好问题! 对于初学者,我建议在服务器SDK或云功能中执行此类管理任务,因为您不希望客户端必须能够开始与每个用户文档进行混淆。

好消息是,一旦开始使用服务器SDK,就可以将查询放入事务中。所以,让我们说user_123从" Jenny"到了" Jen"。您的交易在伪代码中看起来像这样:

  • 开始交易
    • transaction.get(usersRef.where("followingUsers.user_123", ">=", ""))
    • 循环查询结果。从每个文档中获取doc_id并使用它来开始构建事务中的写入。
      • transaction.update("/users/<doc_id>/", {"followingUsers.user_123" : "Jen"})
    • 另请确保添加transactions.update("/users/user_123", {"name": "Jen"})
  • 结束交易

这种一般方法也适用于客户端,但您无法在事务中执行此操作。 (不过,您仍然可以将所有这些更改放入批量写入中。)