Właśnie eksploruję nowy Firebase Firestore, który zawiera typ danych o nazwie reference
. Nie jest dla mnie jasne, co to robi.
- Czy to jest jak klucz obcy?
- Czy można go użyć do wskazania kolekcji, która znajduje się gdzie indziej?
- Jeśli
reference
jest to rzeczywiste odniesienie, czy mogę go używać do zapytań? Na przykład, czy mogę mieć odniesienie, które wskazuje bezpośrednio na użytkownika, zamiast przechowywać ID użytkownika w polu tekstowym? I czy mogę użyć tego odniesienia do zapytań?
firebase
google-cloud-firestore
Jürgen Brandstetter
źródło
źródło
Odpowiedzi:
Referencje są bardzo podobne do kluczy obcych.
Aktualnie wydane zestawy SDK nie mogą przechowywać odniesień do innych projektów. W ramach projektu odniesienia mogą wskazywać na dowolny inny dokument w dowolnej innej kolekcji.
Możesz używać referencji w zapytaniach, jak każdej innej wartości: do filtrowania, porządkowania i stronicowania (startAt / startAfter).
W przeciwieństwie do kluczy obcych w bazie danych SQL odwołania nie są przydatne do wykonywania połączeń w jednym zapytaniu. Możesz ich użyć do wyszukiwania zależnych (które wyglądają jak łączenie), ale bądź ostrożny, ponieważ każdy skok spowoduje kolejną podróż w obie strony na serwer.
źródło
friends
kolekcję z listą wszystkich moich znajomych (friends/myId
). Następnie odsyłam do tego dokumentu wfriends
polu innego dokumentu (group/groupId
). Chciałbym, aby wyświetlić tylko moich przyjaciół, którzy są w tej grupie, robiąc coś takiego:where('friends.myId', '==', true)
.Dodanie poniżej tego, co działało dla mnie przy użyciu referencji w Firestore.
Jak mówią inne odpowiedzi, to jest jak klucz obcy. Atrybut referencyjny nie zwraca jednak danych dokumentu referencyjnego. Na przykład mam listę produktów z referencją userRef jako jednym z atrybutów produktu. Uzyskiwanie listy produktów daje mi odniesienie do użytkownika, który utworzył ten produkt. Ale nie podaje mi szczegółów użytkownika w tym odnośniku. Użyłem innego zaplecza jako usługi ze wskaźnikami, które wcześniej miały flagę „wypełnij: prawda”, która zwraca dane użytkownika zamiast tylko identyfikatora referencyjnego użytkownika, co byłoby fajne, aby mieć tutaj (mam nadzieję, że przyszłe ulepszenie ).
Poniżej znajduje się przykładowy kod, którego użyłem, aby ustawić referencję, a także uzyskać listę produktów, a następnie uzyskać dane użytkownika z podanego identyfikatora referencji użytkownika.
Ustaw referencję w kolekcji:
Uzyskaj kolekcję (produkty) i wszystkie odniesienia do każdego dokumentu (dane użytkownika):
Mam nadzieję że to pomoże
źródło
db.collection('products').get()
. Czy próbowałeś bezpośrednio uzyskać użytkownika? Domyślam się, żenewItem.userRef.get()
powinien działać zamiastdb.collection("users").doc(newItem.userRef.id).get()
uid
i referencje za jego pośrednictwem.reference
jeśli nie możemy go użyć, ponieważ prawdziwy klucz obcy powinien działać?reference
nad astring
jest to, że możesz wywołaćget()
odwołanie bezpośrednio. Jeszcze niezbyt przydatne. Mam nadzieję, że dodają opcję automatycznego zapełniania odniesień odpowiednimi obiektami!Dla tych, którzy szukają rozwiązania JavaScript do wysyłania zapytań przez referencję - chodzi o to, że w instrukcji zapytania należy użyć obiektu „odwołanie do dokumentu”
(Uznanie dla odpowiedzi tutaj: https://stackoverflow.com/a/53141199/1487867 )
źródło