检查 Cloud Firestore 中特定值的文档字段

Check a document field for a specific value in Cloud Firestore

我想使用自定义用户名创建用户注册。我将用户的用户名存储在 Firestore 中的用户文档中。如何验证我的用户集合中已存在的用户名?

也许有人已经有了用于反应式表单验证的代码段?

没有有效的方法来检查集合中所有文档的特定值。你必须依次阅读每份文件,并检查它们。从性能和成本的角度来看,这都是令人望而却步的。

您可以改为创建一个额外的集合(通常称为反向索引或反向映射),您可以在其中使用用户名作为文档的名称,并且(例如)用户的 UID 作为数据文件。然后,您可以轻松地检查用户名是否已被 使用,这是一种直接访问查找,因此具有高度可扩展性。

自从您使用 google-cloud-datastore 标记;如果您确实也在寻找该数据库的答案,请检查 .

在我的 Angular/Ionic 项目中,我使用异步验证器检查用户集合中用户文档中存储为字段的现有用户名。在我的构造函数中我有:

this.signupForm = formBuilder.group({
  username: ['', Validators.compose([Validators.required, 
                                     Validators.minLength(2),
                                     Validators.maxLength(24), 
                                     this.asyncValidator.bind(this)],
  password: ['', Validators.compose([Validators.minLength(6), 
                                     Validators.required])]
})

我的 asyncValidator 方法:

asyncValidator(control) {
  let username = control.value
  return new Promise(resolve => {
    this.checkUsername(username).then(snapshot => {
      if(snapshot.docs.length > 0){
        resolve({
          "username taken": true
        });
      } else {
        resolve(null);
      }
    })
  })
}

我对 Firestore 的查询:

checkUsername(username) {
  return firebase.firestore().collection('users').where("username", "==", username).get()
}

这里是 angular 代码:

 fs_collection: AngularFirestoreCollection<UserItems>;

 this.db.collection<UserItems>('Users’).ref.where('username', '==',
 this.model.username).get().then((ref) => {

             let results = ref.docs.map(doc => doc.data() as UserItems);
             if (results.length > 0) {
                console.log(userData); //do what you want with code
            }
             else {
                 this.error(“no user.”);
             }
         });