[firebase] Firebase Firestore ‘Reference’데이터 유형은 무엇입니까?

방금 새로운 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 )


답변