データベースに値が存在するかどうかを確認できるメソッドがfirebaseにありますか? Firebaseにはメソッド 。exists() がありますが、ドキュメントによると、キーのみをチェックします。
私は次の構造を持っています:
{
"users": {
"-KKUmYgLYREWCnWeHCvO": {
"fName": "Peter",
"ID": "U1EL9SSUQ",
"username": "peter01"
},
"-KKUmYgLYREWCnWeHCvO": {
"fName": "John",
"ID": "U1EL5623",
"username": "john.doe"
}
}
}
値がU1EL5623
existのIDが存在するかどうかを確認したい。
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からの検索処理は不要です。また、オブジェクトに必要なプロパティの1つを知っている場合は、スニペットとして実行でき、オブジェクト全体ではなくこのプロパティのみを取得します。結果は、はるかに高速なチェックになります。
//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();
}
});
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