检查 firebase 数据库中是否存在值

IT技术 javascript firebase firebase-realtime-database
2021-03-19 19:08:45

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

我有以下结构:

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

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

4个回答

exists()方法是snapshotfirebase 查询返回对象的一部分因此请记住,您将无法避免检索数据以验证它是否存在

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

观察:

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

//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();
   }
});
所以我的意思是在主题“KKUmYgLYREWCnWeHCvO”中,我想搜索任何值,比如“Peter”。我不在乎哪个键匹配
2021-05-04 19:08:45
你怎么能用 angularfire2 做到这一点?
2021-05-07 19:08:45
如果不知道密钥“ID”,我该如何搜索?
2021-05-14 19:08:45
@Nikhil 未知或动态?如果您不知道您正在寻找哪个密钥,您将无法检查它是否存在。
2021-05-14 19:08:45
@Xvegas 你可以像这样做: const dbRef = this.db.database.ref(); dbRef.child(childName).orderByChild(objKey).equalTo(keyToCheck).once('value', snapshot => { // your code here });orderByChild部分非常重要。没有它,它对我不起作用。
2021-05-16 19:08:45

如果您想检查 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
              });
            }
        });

我还不能发表评论,所以我发布了一个答案:

要添加到建议的答案中,如果您想查询是否存在任何用户,您可以尝试通过添加 .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

这是我在我的项目的 Firebase 数据库中搜索 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; 
         }
       });
}