Firestore: 조인에 참조 유형 사용

이러한 "참조"유형은 무엇을 위해 사용합니까? Firestore에는 조인도 없습니다.

좋아, 정말이야. 그러나 마음을 "확장"했을 때 마침내 Firebase 9 SDK에서 사용할 수 있는 방법을 찾았습니다. 기술적으로 다른 것과 마찬가지로 참조를 검색할 수 있습니다.

참고: - 여기에서 Angular 예제를 사용하고 있지만 이론은 모든 Firebase 프레임워크와 버전 8에서 동일합니다.

userRef = doc(this.afs, 'users', 'CnbasS9cZQ2SfvGY2r3b');

this.posts = collectionData<Post>(
  query(
    collection(this.afs, 'posts'),
    where('userDoc', '==', userRef),
    orderBy('createdAt')
  ), { idField: 'id' }
);


그래서 그게 무슨의미입니까? 사실, 아무것도. 딱히 장점을 못찾았습니다. 문서 ID를 쉽게 저장하고 검색할 수 있습니다. 누군가가 이것을 유용하다고 생각하면 알려주십시오 ... lol.

하지만...

쿼리



stackoverflow의 내부 깊은 구멍을 탐색하는 동안 발견했습니다 this post . 누군가 댓글에 Firebase가 이 문서를 자동으로 채우길 바란다고 썼습니다. 그래서 나는 생각한다. 왜 안되지? 그제서야 이것이 얼마나 유용한지 깨달았습니다!

암호



문서




expandRef<T>(obs: Observable<T>, fields: any[] = []): Observable<T> {
  return obs.pipe(
    switchMap((doc: any) => doc ? combineLatest(
      (fields.length === 0 ? Object.keys(doc).filter(
        (k: any) => {
          const p = doc[k] instanceof DocumentReference;
          if (p) fields.push(k);
          return p;
        }
      ) : fields).map((f: any) => docData<any>(doc[f]))
    ).pipe(
      map((r: any) => fields.reduce(
        (prev: any, curr: any) =>
          ({ ...prev, [curr]: r.shift() })
        , doc)
      )
    ) : of(doc))
  );
}


컬렉션




expandRefs<T>(
  obs: Observable<T[]>,
  fields: any[] = []
): Observable<T[]> {
  return obs.pipe(
    switchMap((col: any[]) =>
      col.length !== 0 ? combineLatest(col.map((doc: any) =>
        (fields.length === 0 ? Object.keys(doc).filter(
          (k: any) => {
            const p = doc[k] instanceof DocumentReference;
            if (p) fields.push(k);
            return p;
          }
        ) : fields).map((f: any) => docData<any>(doc[f]))
      ).reduce((acc: any, val: any) => [].concat(acc, val)))
        .pipe(
          map((h: any) =>
            col.map((doc2: any) =>
              fields.reduce(
                (prev: any, curr: any) =>
                  ({ ...prev, [curr]: h.shift() })
                , doc2
              )
            )
          )
        ) : of(col)
    )
  );
}



용법



관찰 가능한 문서 주위에 expandRef(...), 관찰 가능한 컬렉션 주위에 expandRefs(...)를 입력하기만 하면 됩니다. 완료!

this.posts = expandRefs(
  collectionData(
    query(
      collection(this.afs, 'posts'),
      where('published', '==', true),
      orderBy(fieldSort)
    ), { idField: 'id' }
  )
);


문서에 저장{ userDoc: ...some doc ref }하면 자동으로 해당 문서를 가져와 문서 데이터에 값을 설정합니다. (모든 적절한 rxjs 연산자를 가져와야 합니다.)

9/11/21 업데이트



속도 조정과 관련 없는 루프를 제거하고 문서가 없으면 오류가 발생하지 않도록 옵션을 추가했습니다! 이제 확장하려는 fields를 입력할 수 있습니다. 이는 또 다른 속도 향상일 뿐만 아니라 모든 필드를 확장하지 않으려는 경우 옵션도 제공합니다! 두 번째 인수에 확장하려는 모든 필드를 입력하기만 하면 됩니다. 두 기능 모두 작동합니다!

this.posts = expandRefs(
  collectionData(
    query(
      collection(this.afs, 'posts'),
      where('published', '==', true),
      orderBy(fieldSort)
    ), { idField: 'id' }
  ),
  ['authorDoc', 'imageDoc']
);


약속하다



당신이 약속 버전을 얻을 수 있다는 것을 잊지 마십시오.pipe(take(1)).toPromise(); 마지막에!

이것은 간단한 JOIN입니다. 놀라운!

천만에요.

제이

좋은 웹페이지 즐겨찾기