2015-04-04 2 views
0

У меня есть простая структура данных пользователей и событий. Я хочу найти всех пользователей, которые посещают те же события, что и зарегистрированный пользователь. Пользователи могут посещать несколько событий.Получить элементы, которые являются частью той же группы в Firebase

Мои данные настройки следующим образом

{ 
    events:{ 
     123:{ 
     name: 'event1', 
     users:{ 
      9876: true, 
      7564: true 
     } 
     } 
    }, 
    users:{ 
     9876:{ 
     name: 'John', 
     events:{ 
      123: true 
     } 
     }, 
     7564:{ 
     name: 'Peter', 
     events:{ 
      123: true 
     } 
     } 
    } 
} 

У меня есть следующий код, чтобы достичь этого, мне было просто интересно, если я нахожусь на правильном пути, и если моя структура данных является правильным для данного типа запроса (Firebaseref является угловой завод)

FirebaseRef.child("users/" + authData.uid + "/events").orderByChild('displayName').once("value", function (snap) { 
    snap.forEach(function (event) { 
     FirebaseRef.child("events/" + event.key() + "/users").once("value", function (userSnap) { 
      userSnap.forEach(function (user) { 
       FirebaseRef.child("users/" + user.key()).once("value", function (realUserSnap) { 
        if (realUserSnap.key() != authData.uid) { 
         //This is a user who attends the same event 
        } 
       }); 
      }); 
     }); 
    }); 
}); 

ответ

0

я бы, вероятно, изменить этот внешний запрос от once('value' к on('child_added' (и другим его child_* братьям и сестрам). Главное преимущество заключается в том, что вы контролируете/синхронизируете данные, а не извлекаете только один раз. Дополнительным преимуществом является то, что он устранит необходимость в вашем первом forEach.

Помимо этого, это выглядит довольно распространенным. Внутренние вызовы должны быть once, потому что вы хотите, чтобы они выполнялись только один раз. Большинство людей нервничают из-за количества звонков on. Но извлечение данных Firebase имеет небольшие накладные расходы после того, как было настроено первоначальное соединение с веб-сокетами, поэтому это обычно выполняется довольно хорошо.

Есть много «должен», «как правило» и «может» в этом ответе, так как единственный способ быть уверенным, для вас на самом деле:

  • убедитесь, что код функционально делает то, что ваш Приложение требует
  • измерения производительности кода в условиях, которые вы ожидаете пользователи сталкиваются с

Если вы столкнетесь с более высоким, чем ожидалось, время ожидания, вы могли бы рассмотреть денормализации данные немного дальше. Например: вы можете сохранить имя пользователя в каждом событии, в котором теперь хранятся true. При этом вам нужно будет искать имя каждого пользователя.

Смежные вопросы