Как получить доступ к объекту в другом объекте в базе данных запросов из функций Firebase? - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь получить доступ к объекту в другом объекте в моей базе данных Firebase, у меня есть такая структура:

enter image description here

Я хочу получить все объекты, которые имеют электронную почту, которую я отправляю по параметрам, я использую .child для доступа к дочерним объектам в моем объекте, но мне не удалось выполнить запрос, это мой код

$ ref_db.child("/groups").child("members").orderByChild("email").equalTo(email).once("value", (snapshot)=>{
      console.log(snapshot.val());
    }); 

Моментальный снимок.val () всегда не определен.

Не могли бы вы помочь мне с запросом?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Одним из эффективных способов получения «всех групп, которые имеют эту электронную почту внутри объекта members», было бы денормализация ваших данных и создание другого «главного узла» в вашей базе данных, где вы храните всех «участников» (т.е. их электронную почту) и "группы", к которым они принадлежат.

Это означает, что каждый раз, когда вы добавляете узел «участник» в «группу» (включая его электронную почту), вы также добавляете группу в качестве дочернего элемента электронной почты участника в этом другом «главном узле».

Конкретнее, вот как будет выглядеть структура базы данных:

Ваша текущая структура:

- groups
  - -LB9o....
   ...
   - members
     - -LB9qbd....
       -email: xxxx@zzz.com
     - -LBA7R....
       -email: yyyyy@aaaa.com

И дополнительная структура:

- groupsByMembers
   - xxxxxx@zzzcom
     - Grupo1: true
   - yyyyy@aaaacom
     - Grupo1: true
     - Grupo2: true
   - bbbcccc@dddcom
     - Grupo6: true
     - Grupo8: true

Обратите внимание, что в «дополнительной структуре» точки в адресе электронной почты удаляются, поскольку вы не можете включить точку в идентификатор узла. Вы должны будете удалить их соответственно при написании и запросе.

Таким образом, вы можете легко запросить список групп, к которым принадлежит участник, как показано ниже. Без необходимости зацикливаться несколько раз на нескольких предметах. Этот метод дерномализации довольно классический в базах данных NoSQL.

    const mailToSearchFor = xxxx.xx@zzz.com;
    const ref = database.ref('/groupsByMembers/' + mailToSearchFor.replace(/\./g, ''));

    ref.once('value', snapshot => {
        const val = snapshot.val();
        for (let key in val) {
            if (val.hasOwnProperty(key)) {
                console.log(key);
            }
        }
    });

Для одновременной записи в два узла базы данных используйте метод update, как описано здесь https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

0 голосов
/ 29 апреля 2018

Это потому, что у вас есть случайный ключ до members, вам нужно пройти путь, а не пропускать узел, чтобы иметь доступ к значениям:

ref_db.child("groups").child("-LB9oWcnE0wXx8PbH4D").child("members").orderByChild("email").equalTo(email).once("value", (snapshot)=>{ 
console.log(snapshot.val()); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...