Firebase Firestore 'Reference' veri türü ne işe yarar?


189

Ben sadece yeni Firebase Firestore keşfetmek ve denilen bir veri türü içeriyor reference. Bunun ne yaptığı bana açık değil.

  • Yabancı anahtar gibi mi?
  • Başka bir yerde bulunan bir koleksiyona işaret etmek için kullanılabilir mi?
  • Eğer referencegerçek bir referanstır, ben sorguları için kullanabilirsiniz? Örneğin, userId'yi bir metin alanında saklamak yerine, doğrudan kullanıcıyı işaret eden bir referans alabilir miyim? Ve bu kullanıcı referansını sorgulama için kullanabilir miyim?

18
Firebase ekibinden bu videonun sizin için parçalandığını düşünüyorum: youtube.com/watch?v=Elg2zDVIcLo (4:36 'dan izleyin)
Adarsh

Yanıtlar:


91

Referanslar yabancı anahtarlara çok benzer.

Şu anda piyasaya sürülen SDK'lar diğer projelere referans depolayamaz. Bir proje içinde referanslar, başka herhangi bir koleksiyondaki başka herhangi bir belgeye işaret edebilir.

Referansları başka herhangi bir değer gibi sorgularda kullanabilirsiniz: filtreleme, sıralama ve sayfalama için (startAt / startAfter).

SQL veritabanındaki yabancı anahtarların aksine, başvurular tek bir sorguda birleştirmeler yapmak için yararlı değildir. Bunları bağımlı aramalar için kullanabilirsiniz (bu birleşme gibi görünür), ancak dikkatli olun çünkü her sekme sunucuya başka bir gidiş dönüşle sonuçlanır.


9
Lütfen, olası kullanım durumlarını paylaşabilir misiniz? Bu referanstaki alanları sorgulamak mümkün müdür? Örneğin friendstüm arkadaşlarımı listeleyen bir koleksiyonum var ( friends/myId). Sonra friendsbaşka bir belge ( group/groupId) alanında bu belgeye başvuruyorum . Ben böyle bir şey yaptığını, o gruptaki yalnızca arkadaşlarım görüntülemek istediğiniz: where('friends.myId', '==', true).
Will

108
Btw, dokümanları referans türü ekleme örneği içerecek şekilde güncellemek yararlı olabilir .
Will

11
Bununla ilgili herhangi bir bilgi bulamıyorum? Bu benim tüm veritabanı yapısını değiştirecek, daha fazla bilmek gerekir ...
Ruben

3
referans kullanarak nasıl sorgulama yapılacağına dair bir örneğiniz var mı (tercihen hızlı bir şekilde)? şu anda ham uid'i dize olarak saklayarak yapabilirim, ancak bu doğru görünmüyor.
Mickey Cheong

6
Sorgu her zaman bir başvuru türü ile başarısız olacağı için tüm referans türleri dizeleri değiştirmek gerekiyor. Kelimenin tam anlamıyla referans türüne göre sorgulama hakkında bir şey bulamıyorum :( kimse referans türlerine göre sorgulama nasıl bulursa bana bildirin ...
Sam Trent

133

Firestore'daki referansları kullanarak benim için neyin işe yaradığını ekleyerek.

Diğer cevapların dediği gibi, yabancı bir anahtar gibi. Reference özniteliği, referans dokümanın verilerini döndürmez. Örneğin, bir kullanıcı listesi ürün üzerindeki özniteliklerden biri olarak bir userRef başvuru ile bir listesi var. Ürünlerin listesini almak, o ürünü oluşturan kullanıcının referansını verir. Ama bana bu referanstaki kullanıcının detaylarını vermiyor. Diğer arka uç işaretçiler ile bir hizmet olarak daha önce burada olması çok iyi olurdu, kullanıcının sadece referans kimliği yerine kullanıcı ayrıntılarını veren "populate: true" bayrağı olan bir hizmet olarak kullandım ).

Aşağıda referans ayarlamak için yanı sıra ürün koleksiyonu almak ve daha sonra verilen kullanıcı referans kimliğinden kullanıcı bilgilerini almak için kullanılan bazı örnek kod aşağıdadır.

Bir koleksiyona referans belirleyin:

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

Bir koleksiyon (ürünler) ve her belgedeki tüm referansları alın (kullanıcı bilgileri):

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) });

Bu yardımcı olur umarım


3
Paylaşım için teşekkürler! Ben Get parçası ilk satırında bir yazım hatası olduğunu düşünüyorum ve olması gerekir db.collection('products').get(). Doğrudan kullanıcı almayı denediniz mi? Sanırım newItem.userRef.get()yerine çalışmalıdb.collection("users").doc(newItem.userRef.id).get()
Sergey Nefedyev

53
Her şeyden önce örnek için teşekkür ederim. Umarım gelecek için bir "nüfus: gerçek" ekleyeceklerdir. Aksi takdirde bir referansı kaydetmek biraz anlamsızdır. Aynı şey, uidve referansını onun aracılığıyla kaydederek de yapılabilirdi .
Jürgen Brandstetter

4
Örnek için teşekkürler! Ancak belgeyi sorguladığımızda "doldur" seçeneği yoksa, başvuru türünü depolamanın anlamı nedir? Herkesin bildiği bir nüfus seçeneği varsa, lütfen bana bildirin.
Harshil Shah

18
Aslında bu bir yabancı anahtar gibi değil. Benim için temelde hiçbir şey yapmaz - referenceeğer bunu gerçek bir yabancı anahtar olarak kullanamazsak ne yapmamız gerekir?
jean d'arme

15
Yani bir referencea'nın tek avantajı , referansı doğrudan stringçağırabilmenizdir get(). Henüz çok yararlı değil. Umarız ilgili nesnelerle referansları otomatik olarak doldurmak için bir seçenek eklerler!
morgler

16

Başvuru ile sorgulama için bir Javascript çözümü arayanlar için - kavram şu ki, sorgu deyiminde bir 'belge başvurusu' nesnesi kullanmanız gerekir

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

(Cevabın cevabı şurada: https://stackoverflow.com/a/53141199/1487867 )

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.