Firebase Firestore 'Reference'데이터 유형은 무엇입니까?


189

방금 새로운 Firebase Firestore를 탐색하고 있으며라는 데이터 유형이 포함되어 있습니다 reference. 이것이 무엇을하는지는 분명하지 않습니다.

  • 외래 키와 같은가요?
  • 다른 곳에 위치한 컬렉션을 가리키는 데 사용할 수 있습니까?
  • reference실제 참조 인 경우 쿼리에 사용할 수 있습니까? 예를 들어 텍스트 필드에 userId를 저장하는 대신 사용자를 직접 가리키는 참조를 가질 수 있습니까? 이 사용자 참조를 쿼리에 사용할 수 있습니까?

18
파이어베이스 팀의이 비디오가 당신을 위해 그것을 분해한다고 생각합니다 : youtube.com/watch?v=Elg2zDVIcLo (4:36부터보기)
Adarsh

답변:


91

참조는 외래 키와 매우 유사합니다.

현재 출시 된 SDK는 다른 프로젝트에 대한 참조를 저장할 수 없습니다. 프로젝트 내에서 참조는 다른 컬렉션의 다른 문서를 가리킬 수 있습니다.

필터링, 순서 지정 및 페이징 (startAt / startAfter)과 같은 다른 값과 같은 쿼리에서 참조를 사용할 수 있습니다.

SQL 데이터베이스의 외래 키와 달리 참조는 단일 쿼리에서 조인을 수행하는 데 유용하지 않습니다. 종속 조회 (조인처럼 보이는)에 사용할 수 있지만 각 홉이 서버로 다시 왕복하므로주의해야합니다.


9
가능한 사용 사례를 공유 할 수 있습니까? 해당 참조의 필드를 쿼리 할 수 ​​있습니까? 예를 들어 friends모든 친구 ( friends/myId)를 나열한 컬렉션 이 있습니다 . 그런 다음 friends다른 문서 ( group/groupId) 의 필드 에서이 문서를 참조합니다 . 해당 그룹에 속한 내 친구 만 표시하고 싶습니다 where('friends.myId', '==', true).

108
Btw, 참조 유형을 추가하는 예제를 포함하도록 문서 를 업데이트하는 것이 유용 할 수 있습니다 .

11
이것에 대한 정보를 찾을 수 없습니까? 이것은 전체 데이터베이스 구조를 바꿀 것입니다. 더 알아야합니다.
Ruben

3
참조를 사용하여 쿼리하는 방법에 대한 예 (바람직하게는 신속한 방법)가 있습니까? 지금은 원시 uid를 문자열로 저장하여 할 수는 있지만 옳지 않은 것 같습니다.
미키 청

6
쿼리는 항상 참조 유형으로 실패하므로 모든 참조 유형을 문자열로 변경해야합니다. 사람이 참조 형식에 의해 쿼리에 알려 주시기 방법을 발견하면 말 그대로 방법을 참조 형에 의한 질의 :( 대해 아무것도 찾을 수 없습니다 ...
샘 트렌트

133

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

도움이 되었기를 바랍니다


3
공유해 주셔서 감사합니다! Get part의 첫 번째 줄에 오타가 있다고 생각합니다 db.collection('products').get(). 사용자를 직접 받으려고 했습니까? newItem.userRef.get()대신 작동해야한다고 생각 합니다db.collection("users").doc(newItem.userRef.id).get()
Sergey Nefedyev

53
우선 예를 들어 주셔서 감사합니다. 나는 그들이 미래를 위해 "인구 : 참"을 추가하기를 희망한다. 그렇지 않으면 참조를 저장하는 것은 다소 의미가 없습니다. uid이를 통해 참조와 참조를 저장하면 동일한 작업을 수행 할 수 있습니다 .
Jürgen Brandstetter

4
예를 주셔서 감사합니다! 그러나 문서를 쿼리 할 때 "인구"종류의 옵션이없는 경우 참조 유형을 저장하는 요점은 무엇입니까? 누구나 알고있는 채우기 옵션이 있으면 알려주십시오.
Harshil Shah

18
사실 외래 키와는 다릅니다. 나에게는 기본적으로 아무것도하지 reference않습니다. 진정한 외래 키로 사용할 수 없다면 요점은 무엇 입니까?
d' arme

14
따라서 reference오버 오버 의 유일한 장점은 참조를 직접 string호출 할 수 있다는 것 get()입니다. 아직 유용하지 않습니다. 그들이 해당 객체로 참조를 자동으로 채우는 옵션을 추가하기를 바랍니다!
morgler

16

참조로 쿼리하기위한 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 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.