2016-07-13 22 views
5

Moje dane są denormalizowane i używają odwrotnego indeksu, jak sugeruje zespół ds. Firebase. Coś podobnego do:Baza danych Firebase - pobieranie wielu wpisów

{ 
    "users": { 
    "alovelace": { 
     "name": "Ada Lovelace", 
     // Index Ada's groups in her profile 
     "groups": { 
     // the value here doesn't matter, just that the key exists 
     "techpioneers": true, 
     "womentechmakers": true 
     } 
    }, 
    ... 
    }, 
    "groups": { 
    "techpioneers": { 
     "name": "Historical Tech Pioneers", 
     "members": { 
     "alovelace": true, 
     "ghopper": true, 
     "eclarke": true 
     } 
    }, 
    ... 
    } 
} 

Teraz chcę załadować wszystkie grupy Ada. Mogę łatwo uzyskać listę identyfikatorów grup, do których należy, ponieważ jest ona częścią jej obiektu użytkownika.

Czy istnieje sposób, aby za jednym razem przesłać zapytanie o wszystkie grupy według Ada? Czy muszę utworzyć identyfikator ValueEventListener dla każdej grupy i zażądać każdej grupy osobno?

Po stronie bezpieczeństwa - załóżmy, że każda grupa jest czytelna tylko dla jej członków, więc nie mogę wysyłać zapytań do wszystkich grup i sortować ich po fakcie.

+0

większości aplikacji za pośrednictwem kluczy z indeksem i załadować każdą grupę indywidualnie. To nie jest duża wydajność, ponieważ Firebase potokuje żądania bazy danych. Zobacz http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-obse/35932786#35932786 –

+0

@FrankvanPuffelen Do masz na myśli, że jeśli przejdę przez listę i ustawię wartość "ValueEventListener" dla każdego z nich, DB zoptymalizuje sposób, w jaki pobiera dane samodzielnie? Czy muszę prosić o dane w określony sposób? –

+0

Wszystkie żądania przechodzą przez to samo połączenie. Jedyną różnicą między 'get (1)', 'get (2)', 'get (3)' i 'getAll ([1,2,3])' jest trochę narzutów dla ramek. –

Odpowiedz

1

Myślę, że można zrobić coś takiego:

var ref = new Firebase("<..>/groups"); 
ref.orderByChild("members/alovelace").equalTo(true) 
    .once('value').then(function(dataSnapshot) { 
    // handle read data 
}) 

(Nietestowane, ale według this głęboko zapytania są teraz obsługiwane)

+0

w systemie Android. Użyj tego: Zapytanie query = mFirebaseDatabaseReference.child ("groups"). OrderByChild ("members /" + user.getId()). equalTo (true); . to jest jedno zapytanie dla wszystkich danych! – itzhar

+0

To podejście ma dwie wady IMO: Po pierwsze, z punktu widzenia bezpieczeństwa - oznacza to, że każdy użytkownik może odczytać całe drzewo 'groups', a po drugie, jeśli mam ogromną liczbę grup, prawdopodobnie będzie to trochę powolne i marnotrawstwo. Znam już identyfikatory grup, które mnie interesują - szkoda, że ​​go nie używam. –

Powiązane problemy