我正在使用firestore,并且用户包含名为domain的属性:
{
domain: "@domain.com"
}
我目前正在使用云功能在注册时为用户生成随机域。云功能查询数据库以检查随机域是否已经存在,这会导致几秒钟的延迟。
我的问题是,如果另一个用户已经存在来自Firestore安全规则的域,而不必查询整个数据库,是否有办法防止插入新用户?
到目前为止,我已尝试将此添加到我的安全规则中,但它允许重复:
match /databases/{database}/documents {
match /users/{Id} {
allow read: if true;
allow create: if get(/databases/$(database)/documents/users/$(Id)).data.domain != request.resource.data.domain;
}
}
只知道使用安全规则是否可行?
答案 0 :(得分:1)
您无法检查集合中任何其他文档中是否已存在集合。如果你认为它有一段时间是有意义的 - 这样的操作会非常昂贵。
您可以做的是检查集合中是否已存在具有特定ID的文档。针对您的问题类型的典型解决方案是创建一个使用域作为ID的集合。
E.g。
users
user1: { domain: "@domain.com" }
user2: { domain: "@other.com" }
domains
"domain.com": "user1"
"other.com": "user2"
现在,您的安全规则可以检查该域名是否已在/domains
集合中声明。
请注意,您希望使用batched write来执行更新,因为此方法中/users
和/domains
必须始终保持同步。