firestore中唯一属性的firebase规则
我发现这个问题在这里比较常见,但我仍然不知道如何管理唯一属性的规则。我有以下文档数据模型:firestore中唯一属性的firebase规则,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我发现这个问题在这里比较常见,但我仍然不知道如何管理唯一属性的规则。我有以下文档数据模型: users/{usereId}/Object users/usernames/Object 第一个对象包含有关用户的基本信息,如: { email: "example@hotmail.edu" photoURL: null providerId: null role: "admin" username:"hello_world" } 同时,u
users/{usereId}/Object
users/usernames/Object
第一个对象包含有关用户的基本信息,如:
{
email: "example@hotmail.edu"
photoURL: null
providerId: null
role: "admin"
username:"hello_world"
}
同时,usernames对象仅包含username
作为属性键,以及uid
作为值,例如:
{
hello_world:"F3YAm8ynF1fXaurezxaQTg8RzMB3"
}
我是这样设置的,因为我希望每个用户都有一个唯一的用户名。迭代第二个对象比遍历第一个对象花费的时间更少。
但回到我的问题上来。我需要hello\u world
在写入操作中是唯一的。但我的规则到目前为止还不起作用。我有:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null
}
match /users/{userID} {
allow create: if !exists(/databases/$(database)/documents/users/$(request.resource.data.username)) <== does not apply
}
}
}
service cloud.firestore{
匹配/databases/{database}/documents{
匹配/{document=**}{
允许读、写:if request.auth.uid!=null
}
匹配/users/{userID}{
允许创建:如果!存在(/databases/$(database)/documents/users/$(request.resource.data.username))您在users
集合中创建了一个名为usernames
的文档,以跟踪正在使用的名称。但是您的规则正在尝试查找一个以当前用户名命名的文档,该文档在此结构中永远不存在
在您当前的结构中,您将需要以下内容:
allow create: if get(/databases/$(database)/documents/users/usernames).data[$(request.resource.data.username)] == request.auth.uid
因此,上面得到的文档保存了所有用户名,然后检查当前用户名是否在当前UID的文档中
另一种方法是保留所有用户名的附加集合,然后使其中的每个文档将单个用户名映射到UID。在这种情况下,您的/usernames
集合将是顶级集合,因为它在所有用户之间共享。这方面的规则将更接近您当前拥有的规则:
allow create: if !exists(/databases/$(database)/documents/usernames/$(request.resource.data.username))
您在users
集合中创建了一个名为usernames
的文档,以跟踪正在使用的名称。但您的规则正在尝试查找一个以当前用户名命名的文档,该文档在此结构中永远不存在
在您当前的结构中,您将需要以下内容:
allow create: if get(/databases/$(database)/documents/users/usernames).data[$(request.resource.data.username)] == request.auth.uid
因此,上面得到的文档保存了所有用户名,然后检查当前用户名是否在当前UID的文档中
另一种方法是保留所有用户名的附加集合,然后使其中的每个文档将单个用户名映射到UID。在这种情况下,您的/usernames
集合将是顶级集合,因为它在所有用户之间共享。这方面的规则将更接近您当前拥有的规则:
allow create: if !exists(/databases/$(database)/documents/usernames/$(request.resource.data.username))
既然你的用户名必须是唯一的,那么使用用户名作为文档键不是一个选项吗?既然你的用户名必须是唯一的,那么使用用户名作为文档键不是一个选项吗?你能在控制台中显示一个屏幕,显示用户/用户名/对象
的样子吗?现在我发现很难找到它e该结构中的集合和文档。当然,我更新了问题:)好的。因此,您在用户
集合中创建了一个名为用户名
的文档,以跟踪正在使用的名称。但是您的规则正在尝试查找以当前用户名命名的文档,而该文档在该结构中永远不存在。您可以吗在控制台中显示用户/用户名/对象
的屏幕?现在我发现很难解析该结构中的集合和文档。当然,我更新了问题。:)好的。所以你在用户
集合中创建了一个名为用户名
的文档来跟踪正在使用的名称。但是你的rules正在试图找到一个以当前用户名命名的文档,该文档在该结构中永远不会存在。我是面向对象数据库结构的初学者,因此总是乐于听取好的建议。你是说除了用户
之外,将用户名
集合作为顶级集合吗?最后我基本上会使用吗rnames/{usernameAsUid}/Object
以及users/{userUid}/对象
是的,有一个额外的顶级/usernames
集合将是一个选择。总是可以寻求好的建议,因为我是面向对象数据库结构的初学者。你是说除了用户
集合之外,将usernames
集合作为顶级集合吗?最后我基本上拥有用户名/{usernameAsUid}/Object
以及users/{userUid}/对象
是的,有一个额外的顶级
/usernames集合将是一个选项。是的,我也考虑过。但与此同时,我制作了另一个数据结构,其中用户名不需要是唯一的。电子邮件必须是唯一的。而且firebase
会自动检查电子邮件是否唯一。你可以这样做那样的话,但是更改用户的用户名是一个很大的难题。Yeah也考虑过这一点。但与此同时,我制作了另一个数据结构,其中用户名不需要是唯一的。电子邮件必须是唯一的。而且firebase
会自动检查电子邮件是否是唯一的。你可以这样做,但更改用户的用户名后,我会这是一个大麻烦