Как структурировать запрос на чтение базы данных Firebase Realtime: упорядочить по ключу - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть данные, хранящиеся в базе данных реального времени Firebase, в следующем формате.

users:
    -L5ZAb7r10_nqss7Ag:
        role: "user"
        email: "person@example.com"
        username: "King Arthur"
    -KL3Abnar7_nals8:
        role: "admin"
        email: "other@example.com"
        username: "Queen Ferdinand"

А в database.rules.json у меня есть:

"users":{
  ".indexOn":["email"],
  ".write": false,
  ".read": "auth != null"
},

На переднем конце Iпопросите пользователя передать свою электронную почту, прошедшего проверку подлинности с помощью Google OAuth, и я хочу узнать, является ли его электронная почта действительным пользователем, и если да, вернуть свою роль и имя пользователя, в противном случае выдается ошибка.Сейчас я перебираю n-ные учетные записи и проверяю электронную почту каждой учетной записи.O (n), очевидно, действительно плохая среда выполнения.

Не зная, что ключ пользователя в базе данных (часть "-L5ZAb7r10_nqss7Ag"), я хочу иметь возможность проверить наличие данного письма в O (1) путем поиска электронной почты в индексированной базе данных.Я имею в виду что-то вроде ниже.Если это возможно, может кто-нибудь указать мне правильную синтаксическую документацию?

firebase.database().ref(`/users/`).getIndexedValue($key/person@example.com).once('value').then(function(snap){
    if(snap == null) console.log("error);
    else{
       user = snap.val();
       console.log(user[role]);
       console.log(user[username]);
    }
}

Я знаю, что вышесказанное не сработает, .getIndexedValue() не реально.Какой будет правильный синтаксис для этой функциональности?Есть ли какой-нибудь способ найти определенное индексированное значение (адрес электронной почты), которое находится ниже произвольного предела (-KL3Abnar7_nals8)?

1 Ответ

0 голосов
/ 15 ноября 2018

Вы ищете orderByChild() и equalTo(). Примерно так:

firebase.database()
  .ref('users')
  .orderByChild('email')
  .equalTo('person@example.com')
  .once('value').then(function(snapshot){
    if (snapshot.exists()) {
      snapshot.forEach(function(snap) {
       user = snap.val();
       console.log(user[role]);
       console.log(user[username]);
      })
    }
}

Чтобы узнать больше о запросах к базе данных Firebase, см. Документацию по сортировке и фильтрации данных . Я также рекомендовал бы проверить некоторые предыдущие вопросы по теме .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...