Одним из эффективных способов получения «всех групп, которые имеют эту электронную почту внутри объекта 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