javascript - Firebase Firestore 'Reference' veri tipi ne işe yarar?
Sadece yeni Firebase Firestore'u keşfediyorum ve içinde reference adlı bir veri türü var. Bunun ne işe yaradığını benim için net 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 referans ise, onu sorgular için kullanabilir miyim? Örneğin, kullanıcı kimliğini bir metin alanında depolamak yerine, doğrudan kullanıcıya işaret eden bir referansa sahip olabilir miyim? Ve bu kullanıcı referansını sorgulama için kullanabilir miyim?
Cevap #1
Firestore'da referansları kullanarak benim için işe yarayanları aşağıya ekliyorum.
Diğer cevapların dediği gibi, bu bir yabancı anahtar gibidir. Ancak referans özniteliği, referans belgesinin verilerini geri vermez. Örneğin, ürünlerin bir listesine sahibim ve ürünlerden birinin özniteliklerinden biri userRef referansıdır. Ürünlerin listesini almak, bana o ürünü oluşturan kullanıcının referansını verir. Ama bu referanstaki kullanıcının detaylarını vermez. Daha önce, başka bir arka uç hizmeti kullanmıştım ve bununla birlikte "populate: true" bayrağı vardı; kullanıcıya ait detaylar sadece referans kimliği yerine geri verilirdi. Bu, burada da olursa harika olurdu (umarım gelecekte bir geliştirme olur).
Aşağıda, referansı ayarlamak ve ardından ürün listesinin koleksiyonunu almak ve verilen kullanıcı referans kimliğinden kullanıcı detaylarını almak için kullandığım bazı örnek kod bulunmaktadır.
Bir koleksiyona referans ayarla:
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 belgede tüm referansları (kullanıcı detayları) alın:
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) });
Cevap #2
Referanslar, yabancı anahtarlar gibidir.
Şu anda yayımlanan SDK'lar diğer projelere referansları depolayamaz. Bir proje içinde, referanslar herhangi bir koleksiyondaki herhangi bir başka belgeye işaret edebilir.
Sorgularda referansları diğer değerler gibi kullanabilirsiniz: filtreleme, sıralama ve sayfalandırma (startAt/startAfter) için.
Bir SQL veritabanındaki yabancı anahtarlardan farklı olarak, referanslar tek bir sorguda birleşimler yapmak için kullanışlı değildir. Onları bağımlı aramalar için kullanabilirsiniz (birleştirme gibi görünebilir), ancak dikkatli olun çünkü her atlama sunucuya başka bir tur gidip gelmeye neden olur.
Cevap #3
Referansa göre sorgulama için Javascript çözümü arayanlar için - kavram şudur ki, sorgu ifadesinde bir 'belge referansı' 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) {
//
});
(Cevap için teşekkürler: https://stackoverflow.com/a/53141199/1487867)
Cevap #4
Birçok cevap bunun sadece başka bir belgeye bir referans olduğunu ancak o referans için veri döndürmediğini belirtti, ancak veriyi ayrı olarak almak için bunu kullanabiliriz.
İşte bunu firebase JavaScript SDK 9, modular sürümünde nasıl kullanabileceğinize dair bir örnek.
Firestore'unuzda products adlı bir koleksiyon olduğunu ve bunun aşağıdaki belgeyi içerdiğini varsayalım.
{
name: 'productName',
size: 'medium',
userRef: 'user/dfjalskerijfs'
}
burada kullanıcıların users koleksiyonundaki bir belgeye referansı vardır. ürünü almak ve ardından referanstan kullanıcıyı almak için aşağıdaki kod parçasını kullanabiliriz.
import { collection, getDocs, getDoc, query, where } from "firebase/firestore";
import { db } from "./main"; // firestore db object
let productsWithUser = []
const querySnaphot = await getDocs(collection(db, 'products'));
querySnapshot.forEach(async (doc) => {
let newItem = {id: doc.id, ...doc.data()};
if(newItem.userRef) {
let userData = await getDoc(newItem.userRef);
if(userData.exists()) {
newItem.userData = {userID: userData.id, ...userData.data()}
}
productwithUser.push(newItem);
} else {
productwithUser.push(newItem);
}
});
işte collection, getDocs, getDoc, query, where ihtiyaç duyduğumuzda veri almak için kullanabileceğimiz firestore ile ilgili modüllerdir. products belgesinden döndürülen kullanıcı referansını kullanarak o referans için kullanıcı belgesini almak için aşağıdaki kodu kullanıyoruz,
let userData = await getDoc(newItem.userRef);
Modüler ver SDK'sını nasıl kullanacağınız hakkında daha fazla bilgi edinmek için resmi belgelere başvurun.
Cevap #5
https://youtu.be/Elg2zDVIcLo?t=276 adresindeki #AskFirebase'e göre, şimdilik birincil kullanım durumu Firebase konsol UI'da bir bağlantıdır
