【问题标题】:How to check all documents in a collection for a value firestore reactjs如何检查集合中的所有文档的值firestore reactjs
【发布时间】:2021-12-04 23:43:20
【问题描述】:

这是我的代码:

function loginHandler() {

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

    }

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

function loginHandler() {

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

    }

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

【问题讨论】:

    标签: javascript reactjs google-cloud-firestore


    【解决方案1】:

    1.从第二个代码sn-p开始

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

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

      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。从第一个代码 sn -p

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

    第一个代码 sn-p 从 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 控制台 check it out here 中创建用户名和密码字段的复合索引

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-09
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      相关资源
      最近更新 更多