检查firebase数据库中是不是存在值
Posted
技术标签:
【中文标题】检查firebase数据库中是不是存在值【英文标题】: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是否存在。
【问题讨论】:
【参考方案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);
);
观察:
如果您处于不同的场景中,您拥有对象可能所在的确切引用路径,则无需添加orderByChild
和equalTo
。在这种情况下,您可以直接获取对象的路径,这样就不需要从 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;
);
【讨论】:
以上是关于检查firebase数据库中是不是存在值的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 Unity 的 Firebase 数据库中是不是已存在键/值