Do czego służy typ danych "Reference" Firebase Firestore?

[2]}właśnie odkrywam nową bazę Firebase Firestore i zawiera ona typ danych o nazwie reference. Nie jest dla mnie jasne, co to robi.

  • czy to jak obcy klucz?
  • czy można go użyć do wskazania zbioru, który znajduje się gdzieś indziej?
  • Jeśli {[0] } jest rzeczywistym odniesieniem, czy mogę go użyć do zapytań? Na przykład Czy Mogę mieć odniesienie, które wskazuje bezpośrednio na użytkownika, zamiast przechowywać identyfikator użytkownika w polu tekstowym? I czy mogę użyć tego użytkownika Referencja do zapytań?
Author: benomatis, 2017-10-04

4 answers

Odniesienia 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 dowolnym innym zbiorze.

Możesz używać referencji w zapytaniach jak każda inna wartość: do filtrowania, zamawiania i stronicowania (startAt/startAfter).

W przeciwieństwie do kluczy obcych w bazie danych SQL, referencje nie są przydatne do wykonywania połączeń w jednym zapytaniu. Można ich używać w zależności poszukaj (które wydają się dołączać), ale bądź ostrożny, ponieważ każdy skok spowoduje kolejną podróż w obie strony do serwera.

 106
Author: Gil Gilbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-01 22:08:59

Dodanie poniżej tego, co mi się udało, używając referencji w Firestore.

Jak mówią inne odpowiedzi, to jest jak obcy klucz. Atrybut reference nie zwraca jednak danych dokumentu reference. Na przykład, mam listę Produktów, z referencją userRef jako jednym z atrybutów na produkcie. Uzyskanie listy produktów daje mi odniesienie do użytkownika, który stworzył 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 wcześniej mają flagę "wypełniać: prawda", która daje dane użytkownika z powrotem, a nie tylko identyfikator referencyjny użytkownika, co byłoby wspaniale mieć tutaj (miejmy nadzieję, że w przyszłości poprawa).

Poniżej znajduje się przykładowy kod, którego użyłem, aby ustawić referencję, a także uzyskać listę kolekcji produktów, a następnie uzyskać dane użytkownika z podanego identyfikatora referencyjnego użytkownika.

Ustaw referencję na zbiorze:

let data = {
  name: 'productName',
  size: 'medium',
  userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);

Pobierz kolekcję (produkty) i wszystkie odniesienia na każdym dokumencie (dane użytkownika):

db.collection('products').get()
    .then(res => {
      vm.mainListItems = [];
      res.forEach(doc => {
        let newItem = doc.data();
        newItem.id = doc.id;
        if (newItem.userRef) {
          newItem.userRef.get()
          .then(res => { 
            newItem.userData = res.data() 
            vm.mainListItems.push(newItem);
          })
          .catch(err => console.error(err));
        } else {
          vm.mainListItems.push(newItem);  
        }

      });
    })
    .catch(err => { console.error(err) });

Hope this helps

 153
Author: Ben Cochrane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-24 16:16:59

Dla tych, którzy szukają rozwiązania Javascript do zapytań przez odniesienie-koncepcja polega na tym, że musisz użyć obiektu "document reference" w instrukcji zapytania

teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
  //
}).catch(function(error) {
  //
});

(Chwała odpowiedzi tutaj: https://stackoverflow.com/a/53141199/1487867 )

 18
Author: Aswin Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-19 20:50:54

Według # AskFirebase https://youtu.be/Elg2zDVIcLo?t=276 głównym przypadkiem użycia na razie jest link w Firebase console UI

 2
Author: Pavel Shastov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-21 08:19:52