首页 > 解决方案 > 为什么firestore中的给定示例不能按照文档工作?

问题描述

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow write: if request.auth.uid != null &&
        getAfter(
          /databases/$(database)/documents/countries/$(request.resource.data.country)
        ).data.last_updated == request.time;
    }

    match /countries/{country} {
      allow write: if request.auth.uid != null;
    }    
    }
}

我尝试按如下方式执行数据库:

countries/{country}
fields : last_updated

cities/{city}
fields :Populations, country

如果我改变一个城市的人口,它应该自动更新特定国家的last_updated字段。

但它没有发生吗?我参考了本教程:事务和批量写入

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


您定义的安全规则仅强制执行是否允许文档读/写;他们实际上并没有修改文档的数据。所以你的规则

match /cities/{city} {
  allow write: if request.auth.uid != null &&
    getAfter(
      /databases/$(database)/documents/countries/$(request.resource.data.country)
    ).data.last_updated == request.time;
}

last_updated只是说“如果在事务或批量写入结束时,相应国家的字段也已更新,则允许写入城市文档。”

在您的客户端代码中,您需要一个事务(或批量写入),它 (1) 写入城市文档,以及 (2) 更新国家/地区的 last_updated 时间。


推荐阅读