2017-01-05 79 views
5

Oglądałem this video, która mówi o aktualizacjach wielościeżkowych w Firebase. Aktualizacje wielościeżkowe są świetne, ponieważ pozwalają na wywołanie metody firebaseRef.update() dwa lub więcej razy, podczas gdy mają one jedną operację atomową, wszystko lub nic.Czy istnieje coś takiego jak "Multi-Path Push" w bazie danych Firebase Real-Time?

To jest świetne, ale w mojej obecnej sytuacji nie chcę używać metody aktualizacji (). Zamiast tego chcę użyć metody FirebaseRef: push i umożliwić Firebase wygenerowanie unikalnego klucza dla mojego obiektu.

Najtrudniejsze jest to, że zdenormalizowałem moje dane, aby znajdowały się w dwóch miejscach. Naprawdę chciałbym mieć operację atomową, wszystko lub nic, która używa operacji Firebase push(), aby utworzyć unikalny klucz, a następnie zapisać obiekt z tym kluczem w 2 lub więcej różnych miejscach wewnątrz mojej bazy danych dane. Jednak składnia dla funkcji push() już używa obiektu, więc to, co chcę zrobić, nawet możliwe?

Uwaga: Innym możliwym rozwiązaniem może być użycie Firebase api jakoś wygenerować unikalny klucz klienta, a następnie wykonaj standardową aktualizację wielościeżkowego użyciem że wygenerowany klucz jako klucz do mojego obiektu jest włożona.

+1

Na koniec zauważyłeś odpowiedź na twoje pytanie. var key = firebase.database(). Ref ('somestring'). Push(); zwróci Ci klucz bez wpisywania czegokolwiek w bazie danych bazy ogniowej. Użyj tego klucza, aby utworzyć obiekt, a następnie wywołaj aktualizację() –

+0

Załóżmy jednak, że użytkownik opuszcza aplikację po pierwszym przejściu i przed upływem drugiego. Wtedy moje denormalizowane dane są niespójne. Chcę zrobić to wszystko w jednej operacji atomowej. – Jim

+0

następnie użyć transakcji() jest zbudowany do tego celu. Ale ponieważ mój osobisty punkt widzenia wykorzystuje transakcje tylko wtedy, gdy jest to naprawdę konieczne. –

Odpowiedz

11

Nie ma wielu lokalizacji pchania, ale ponieważ identyfikatory push są generowane po stronie klienta, można użyć aktualizacji wielu lokalizacji, aby robić to, co chcesz.

Można wygenerować identyfikator Push, wywołując push bez żadnych argumentów. Identyfikatory push są generowane po stronie klienta i generowania jednego wiąże się interakcji z bazy danych:

let key = firebase.database().ref().push().key; 

Można wykorzystać AngularFire2 to zrobić, zbyt; choć trzeba przejść argument (undefined) do push uspokoić maszynopis:

let key = angularFire.database.list('').push(undefined).key; 

Po wygenerowaniu klucza, można utworzyć aktualizacji wielu lokalizacji:

let obj = { some: 'object' }; 
angularFire.database.object('').update({ 
    [`a/path/${key}`]: obj, 
    [`another/path${key}`]: obj 
}); 

Aktualizacja jest atomowy, więc albo wszystkie ścieżki zostaną zaktualizowane, albo nie będą.

+1

niesamowite. Używanie push bez argumentów było kluczem! (nie gra słów przeznaczonych hehe) – Jim

+0

dzięki, ta praca –