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
会自动检查电子邮件是否是唯一的。你可以这样做,但更改用户的用户名后,我会这是一个大麻烦