반응형
Angular에서 Firebase Cloud Firestore DB 데이터 조회 시 Paging 처리를 좀 더 효과적으로 하고자 할 때 참고 바랍니다.
import { AngularFirestore } from '@angular/fire/firestore';
import { first } from 'rxjs/operators';
import * as firebase from 'firebase';
export const dbRootPath: string = "rootPath";
// 조회 타입 정의
enum queryType { "init", "after" };
type QueryType = keyof typeof queryType;
// 기본 셋팅 정의
export interface QueryConfig {
type: QueryType,
path: string,
orderByField?: string,
reverse?: boolean,
limit?: number,
page?: string
}
// 조건절 정의
export interface WhereConfig {
field: string[],
value: any[],
operator: firebase.firestore.WhereFilterOp[]
}
export class FirebasePagination {
constructor(private afs: AngularFirestore) { }
lastVisible: {
page: string,
doc: firebase.firestore.QueryDocumentSnapshot
}[] = [];
// 데이터 조회 (페이징 처리)
async paginationQuery(queryConfig: QueryConfig, whereConfig?: WhereConfig) {
try {
const lastVisibleIndex: number = this.lastVisible.findIndex(data => data.page === queryConfig.page);
const result = await this.afs.collection<any>(dbRootPath + '/' + queryConfig.path, (ref) => {
let queryRef: firebase.firestore.Query = ref;
if (queryConfig.orderByField) {
queryRef = queryRef.orderBy(queryConfig.orderByField, queryConfig.reverse ? 'desc' : 'asc');
}
if (whereConfig && whereConfig.field.length > 0) {
for (let i: number = 0; i < whereConfig.field.length; i++) {
queryRef = queryRef.where(whereConfig.field[i], whereConfig.operator[i], whereConfig.value[i]);
}
}
if (queryConfig.limit) {
queryRef = queryRef.limit(queryConfig.limit);
}
// 조회 타입이 after일 경우 적용
if (queryConfig.type === "after" && lastVisibleIndex >= 0) {
queryRef = queryRef.startAfter(this.lastVisible[lastVisibleIndex].doc);
}
return queryRef
}).get().pipe(first()).toPromise();
// 조회 데이터 마지막 값 저장
if (result.docs.length > 0) {
if (lastVisibleIndex >= 0) {
this.lastVisible[lastVisibleIndex] = {
page: queryConfig.page,
doc: result.docs[result.docs.length - 1]
};
} else {
this.lastVisible.push({
page: queryConfig.page,
doc: result.docs[result.docs.length - 1]
});
}
}
const resultArr: any[] = [];
result.docs.forEach(item => {
let _item: any = item.data();
_item.docId = item.id; // id 값 포함시키기 위함
resultArr.push(_item);
});
return resultArr;
} catch (error) {
throw error;
}
}
}
반응형
'프로그래밍 & IT 정보 > Etc.' 카테고리의 다른 글
React Redux 효율적인 공부 방법 (0) | 2022.02.27 |
---|---|
리액트(React) 완성도 높은 초보 온라인 무료 강의 추천 (0) | 2022.02.24 |
인공지능, 머신러닝, 딥러닝 다 같은 말 아닌가요? 간단한 개념 설명 (1) | 2022.01.17 |
[SVG] animateTransform 2가지 동시 적용 (0) | 2020.07.04 |
[Ionic4] ion-select customizing(커스터마이징) 방법 (0) | 2020.07.04 |
[Ionic4] Scroll Event를 활용한 데이터 추가 로딩 방법 (0) | 2020.07.03 |
[Ionic4] Android MainActivity.java 변경 필요 시 적용 방법 (0) | 2020.07.03 |
[Firebase/Angular] Cloud Firestore Transaction Example (0) | 2020.07.03 |
댓글