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입니다. 놀라운!
천만에요.
제이
Reference
이 문제에 관하여(Firestore: 조인에 참조 유형 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jdgamble555/firestore-using-reference-types-for-joins-4194텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)