繁体   English   中英

如何检查集合中的所有文档以获取值 Firestore reactjs

[英]How to check all documents in a collection for a value firestore reactjs

这是我的代码:

function loginHandler() {

        firestore.collection("users").forEach(user => {
            if (user.username === queryUsername && user.password === queryPassword) {
                navigate("/");
            }
            else {
                setMode("INCORRECT")
            }
        })

    }

我正在尝试检查我的 firestore 数据库的用户集合中的文档是否具有 queryUsername 的用户名属性和 queryPassword 的密码属性。 当我运行这个 function 时:

function loginHandler() {

            if (firestore.collection("users").doc("doc that definetly doesnt exist")) {
                console.log("exists")
            }
            else {
                console.log("doesnt exist")
            }

    }

它记录由于某种原因而存在

1.从第二个代码片段开始

firebase.collection("someCollection").doc("some docID which might exist or not")

上面的代码根据 firebase 返回 object 或快照,它为您提供有关您正在查找的文档是否存在的信息。 通过代码暗示,您的代码将始终返回文档存在,因为传递给if语句的 object 始终为真。 从 firebase 官方文档这将是解决这个问题的方法

  firebase.collection("SomeCollection").doc("some document ID which exists or not").get()
   .then((user)=>{
          
        if(user.exists){
          console.log("exists");
        } else{
          console.log("doesn't exists");
         }
   
   })

2.从第一个代码片段

一些注意事项从您想要执行某种身份验证的事情的外观来看,虽然存储用户真实密码是高风险和不好的做法,如果您想存储密码,您可以 hash 它们,但为了说明目的,我将使用您的代码示例.

第一个代码片段从 firebase 数据库中获取所有文档并在客户端进行检查,这是低效的,并且假设您的集合大小变为无穷大,这不是一个好习惯,我将尝试修复您的代码,然后提供更好的解决方案

您的代码解决方案当您阅读 firebase 集合时,您得到的是文档的快照,您必须在每个快照上调用.data()以获取存储在 firebase 上的实际文档。 假设用户名和密码是原始存储的,您的代码解决方案现在将是这样的

function loginHandler() {

    firestore.collection("users").get().then(users => {
        users.forEach((user)=>{
          if (user.data().username === queryUsername && user.data().password === queryPassword) {
            navigate("/");
        }
        else {
            setMode("INCORRECT")
        }
        })
    })

}

高效的

最有效的方法是从数据库级别运行此代码,在这种情况下,您不必随着应用程序的增长而累积成本以进行文档读取。

firestore.collection("users").where("username","==",queryUsername)
  .where("password","==",querypassword).limit(1).get()
   .then((result)=>{
        if(result.exists){
           console.log("do something after users creds are ok")    
        }else{
           console.log("do something if not ok")
        } 
    })

请注意,您必须在 Firestore 控制台中创建用户名和密码字段的复合索引, 请在此处查看

我使用的限制不是故意的,因此我只能返回一个匹配的文档并在快照上调用.exists ,否则即使只能找到一个文档,它也会返回快照数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM