【问题标题】:Check if value exists in firebase DB检查firebase数据库中是否存在值
【发布时间】:2016-10-20 23:17:29
【问题描述】:

firebase 中是否有一种方法可以检查数据库中是否存在值? Firebase 有方法 .exists(),但根据文档,它只检查键。

我有以下结构:

{
  "users": {
    "-KKUmYgLYREWCnWeHCvO": {
      "fName": "Peter",
      "ID": "U1EL9SSUQ",
      "username": "peter01"
    },
    "-KKUmYgLYREWCnWeHCvO": {
      "fName": "John",
      "ID": "U1EL5623",
      "username": "john.doe"
    }
  }
}

我想检查值为U1EL5623的ID是否存在。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    exists() 方法是由 firebase 查询返回的 snapshot 对象的一部分。所以请记住,您将无法避免检索数据以验证其是否存在

    ref.child("users").orderByChild("ID").equalTo("U1EL5623").once("value",snapshot => {
        if (snapshot.exists()){
          const userData = snapshot.val();
          console.log("exists!", userData);
        }
    });
    

    观察:

    如果您处于不同的场景中,您拥有对象可能所在的确切引用路径,则无需添加orderByChildequalTo。在这种情况下,您可以直接获取对象的路径,这样就不需要从 firebase 进行任何搜索处理。此外,如果您知道对象必须具有的属性之一,您可以像下面的 sn-p 那样进行操作,并使其仅检索此属性而不是整个对象。结果将是一个更快的检查。

    //every user must have an email
    firebase.database().ref(`users/${userId}/email`).once("value", snapshot => {
       if (snapshot.exists()){
          console.log("exists!");
          const email = snapshot.val();
       }
    });
    

    【讨论】:

    • 如何使用 angularfire2 做到这一点??
    • @Xvegas 你可以这样做:const dbRef = this.db.database.ref(); dbRef.child(childName).orderByChild(objKey).equalTo(keyToCheck).once('value', snapshot => { // your code here }); orderByChild 部分非常重要。没有它,它对我不起作用。
    • 如果不知道密钥“ID”,我该如何搜索?
    • @Nikhil 未知或动态?如果您不知道要查找的密钥,您将无法检查它是否存在。
    • 所以我的意思是在“KKUmYgLYREWCnWeHCvO”主题内,我想搜索任何值,比如“Peter”。我不在乎哪个键匹配
    【解决方案2】:

    如果您想检查电子邮件是否存在于 firebase 中,这是一个类似的解决方案

    firebase.app().database().ref("shops").orderByChild("email")
       .equalTo(user.email).once("value", snapshot => {
    
                const userData = snapshot.val();
    
                // Check if it is a SHOP.
                if (userData) {
                  console.log("Shop logged in!");
                  this.setState({
                    isAdminLoggedIn: false,
                    isUserLoggedIn: false,
                    isShopLoggedIn: true,
                    isNoneLoggedIn: false
                  });
    
                // Check if it is a USER.
                } else {
                  console.log("User logged in");
                  this.setState({
                    isAdminLoggedIn: false,
                    isUserLoggedIn: true,
                    isShopLoggedIn: false,
                    isNoneLoggedIn: false
                  });
                }
            });
    

    【讨论】:

      【解决方案3】:

      我还不能制作cmets,所以我发布一个答案:

      要添加到建议的答案,如果您想查询是否存在任何用户,您可以尝试通过添加 .limitToFirst(1) 或 .limitToLast(1) 来提高性能。这样您就可以将检索到的数据限制在最低限度:

      //Check if any users exist
      firebase.database().ref(`users`).limitToFirst(1).once("value", snapshot => {
         if (snapshot.exists()){
            console.log("exists!");
            // TODO: Handle that users do exist
            return true;
         }
      
         // TODO: Handle that users do not exist
      });
      

      来源:https://firebase.google.com/docs/reference/js/firebase.database.Query#limitToFirst

      【讨论】:

        【解决方案4】:

        这就是我在项目的 Firebasebase 数据库中搜索 url 值的方式:

        
        const searchFirebase = (url, idx) => 
        {
             firebase
               .app()
               .database()
               .ref("recipes")
               .orderByChild("url")
               .equalTo(url)
               .once("value", (snapshot) => {
                 if (snapshot.exists()) {
                   const userData = snapshot.val();
                   console.log("exists!", userData);
                   document.querySelector(`[data-recipe-id="${idx}"]`)
                   .classList.replace('fav-heart', 'unfav-heart'); 
                 } else {
                   return false; 
                 }
               });
        }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-02
          • 1970-01-01
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          • 2021-01-14
          • 2020-07-31
          相关资源
          最近更新 更多