2017-10-04 59 views
49

Yeni Firebase Firestore'u araştırıyorum ve reference adlı bir veri türü içeriyor. Bunun ne olduğu bana açık değil.Firestore Referans veri türü ne için iyidir?

  • yabancı anahtarın gibi mi?
  • Başka bir yere yerleştirilmiş bir koleksiyona işaret etmek kullanılabilir mi?
  • reference gerçek bir başvuruysa, sorgularda kullanabilir miyim? Örneğin, userId'yi bir metin alanına kaydetmek yerine doğrudan kullanıcıya işaret eden bir referans alabilir miyim? Ve bu kullanıcı referansını sorgulama için kullanabilir miyim?

cevap

26

Kaynaklar çok yabancı anahtarları gibidir.

Mevcut SDK'lar diğer projelere başvuruda bulunamaz. Bir proje içinde referanslar başka bir koleksiyondaki diğer herhangi bir belgeye işaret edebilir. filtreleme, sipariş için ve çağrı (startAt/startAfter) için:

Başka değeri gibi sorgularda başvuruları kullanabilirsiniz. Bir SQL veritabanındaki yabancı anahtarlardan farklı olarak, başvurular tek bir sorguda birleştirme gerçekleştirmek için kullanışlı değildir. Bunları bağımlı aramalar için kullanabilirsiniz (bu şekilde birleştirme gibi görünür), ancak dikkatli olun, çünkü her atlama, sunucuya başka bir gidişatla sonuçlanır. Firestore'daki referansları kullanarak benim için çalışılanın altına eklenmesi

+6

Lütfen olası kullanım durumlarını paylaşabilir misiniz? Bu referanstaki alanları sorgulamak mümkün mü? Örneğin. Bütün arkadaşlarımı ('friends/myId') listeleyen bir 'arkadaşlar' koleksiyonum var. Ardından, bu belgeyi başka bir belgenin '' '' alanındaki '' alanına ('group/groupId') gönderiyorum. Sadece bu grupta yer alan arkadaşlarımı, şöyle bir şey yapmak istiyorum: 'Nerede ('friends.myId', '==', true)'. – Will

+45

Btw, bir referans türü ekleme örneği eklemek için [docs] 'u (https://firebase.google.com/docs/firestore/manage-data/add-data) güncelleştirmek yararlı olabilir. – Will

+6

Bu konuda herhangi bir bilgi bulamıyorum? Bu tüm veritabanı yapısını değiştirecek, daha fazla bilmem gerek ... – Ruben

15

. Diğer cevaplarda da belirtildiği gibi, yabancı anahtar gibidir. Referans özelliği, referans dokümanın verilerini döndürmez. Örneğin, üründeki bir özellik olarak userRef referansına sahip bir ürün listem var. Ürünlerin listesini almak bana o ürünü oluşturan kullanıcının referansını verir. Ama bana bu referansta kullanıcının detaylarını vermiyor. Kullanıcının referans kimliği yerine kullanıcı ayrıntılarını geri veren bir "populate: true" bayrağı daha önce işaretçileri olan bir hizmet olarak diğer arka uçları kullandım.). Aşağıda

Sonra verilen kullanıcı referans kimliğine kullanıcı bilgilerini almak referansını ayarlamak yanı sıra ürünlerin listesinin koleksiyonu almak için kullanılan bazı örnek kodudur.

Set koleksiyonu referans:

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

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

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

Umut bu

yardımcı olur
+1

Paylaşım için teşekkürler! Bence ilk bölümün içinde bir yazım hatası var ve db.collection ('products') olmalıdır. Doğrudan kullanıcı almayı denediniz mi? "NewItem.userRef.get()" yerine "db.collection (" users ") yerine çalışmalıyım. Doc (newItem.userRef.id) .get()' –

+0

Teşekkür @CRG yazım hatası ve userRef.get() yerine iyi bir nokta - bunu yapmak için daha basit bir temizlik yolu - teşekkürler –

+4

Öncelikle örnek için teşekkür ederim. İnşallah gelecek için bir "populate: true" ekleyecektir. Aksi halde bir referansı kaydetmek biraz anlamsızdır. Aynı şey, 'uid' 'i kaydetme ve bunun üzerinden referans yapma yoluyla yapılabilirdi. –