방금 새로운 Firebase Firestore를 탐색하고 있으며라는 데이터 유형이 포함되어 있습니다 reference
. 이것이 무엇을하는지는 분명하지 않습니다.
- 외래 키와 같은가요?
- 다른 곳에 위치한 컬렉션을 가리키는 데 사용할 수 있습니까?
reference
실제 참조 인 경우 쿼리에 사용할 수 있습니까? 예를 들어 텍스트 필드에 userId를 저장하는 대신 사용자를 직접 가리키는 참조를 가질 수 있습니까? 이 사용자 참조를 쿼리에 사용할 수 있습니까?
답변
참조는 외래 키와 매우 유사합니다.
현재 출시 된 SDK는 다른 프로젝트에 대한 참조를 저장할 수 없습니다. 프로젝트 내에서 참조는 다른 컬렉션의 다른 문서를 가리킬 수 있습니다.
필터링, 순서 지정 및 페이징 (startAt / startAfter)과 같은 다른 값과 같은 쿼리에서 참조를 사용할 수 있습니다.
SQL 데이터베이스의 외래 키와 달리 참조는 단일 쿼리에서 조인을 수행하는 데 유용하지 않습니다. 종속 조회 (조인처럼 보이는)에 사용할 수 있지만 각 홉이 서버로 다시 왕복하므로주의해야합니다.
답변
Firestore에서 참조를 사용하여 나에게 도움이 된 것을 아래에 추가하십시오.
다른 답변에서 알 수 있듯이 외래 키와 같습니다. reference 속성은 참조 문서의 데이터를 반환하지 않습니다. 예를 들어, userRef 참조가 제품의 속성 중 하나 인 제품 목록이 있습니다. 제품 목록을 가져 오면 해당 제품을 만든 사용자에 대한 참조가 제공됩니다. 그러나 그것은 그 참조에서 사용자의 세부 사항을 제공하지 않습니다. 나는 다른 백엔드를 포인터가있는 서비스로 사용하기 전에 “populate : true”플래그를 사용하여 사용자의 참조 ID 대신 사용자 세부 정보를 다시 제공합니다. ).
아래는 참조를 설정하고 제품 모음을 얻은 다음 주어진 사용자 참조 ID에서 사용자 세부 정보를 얻는 데 사용 된 예제 코드입니다.
컬렉션에 대한 참조를 설정하십시오.
let data = {
name: 'productName',
size: 'medium',
userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);
각 문서에 대한 컬렉션 (제품) 및 모든 참조 자료 (사용자 세부 정보)를 가져옵니다.
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) });
도움이 되었기를 바랍니다
답변
참조로 쿼리하기위한 Javascript 솔루션을 찾는 사용자의 경우 개념은 쿼리 문에 ‘문서 참조’오브젝트를 사용해야한다는 것입니다.
teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
//
}).catch(function(error) {
//
});
( https://stackoverflow.com/a/53141199/1487867 )