[’집중력’, ‘오메가3’, ‘지방산’, ‘20대’] 과 같은 형태로 카테고리가 저장되어 있음. [‘집중력’, ‘20대’] 와 같이 2개 이상의 카테고리를 모두 포함하는 상품 리스트를 필터링하여 보여주고싶은데 firebase에서 배열의 요소 and 검색은 1가지만 지원한다고 함.
고민한 방법
✅ or 조건으로 하나라도 해당되는 데이터를 가지고 온 후 출력시에 필터링 해서 보여주기
데이터를 객체로 저장하기 https://stackoverflow.com/questions/52837711/firestore-multiple-array-contains
카테고리 = {
"집중력": true,
"오메가3": true,
"지방산": true
}
1번 방법을 선택한 이유 적어주기
예상되는 문제점 : 한페이지에 10개의 아이템을 보여줘야하는데 필터링 후 데이터가 5개라면 남은 공간이 비어있게 됨
해결 방법
필터링된 데이터가 보여줘야할 데이터보다 적을 경우 다음 페이지를 추가로 호출
const { id } = useParams();
const { data, isLoading, error, fetchNextPage, hasNextPage, isFetchingNextPage } = useProducts(filters);
let products = data?.pages.flatMap((page: any) => page.products);
/* ===== 필터링 조건 =====
1. 필터 요소를 모두 포함
2. 기준 아이템이 있다면 제외
3. 최대 길이 = pageSize
======================== */
if (products) {
products = products.filter((product: Product) =>
categories && containsAllCategories(product.productCategory, categories) && product.id != id
).slice(0, pageSize);
}
// 데이터가 변경되었을 때 필터링된 데이터가 inView가 true거나 (화면에 보이거나)
// 보여줘야할 데이터 개수보다 적을 경우 다음 페이지를 호출
useEffect(() => {
if (data && data.pages) {
if (products && products.length < pageSize && inView && hasNextPage) {
fetchNextPage();
}
}
}, [data, inView, fetchNextPage, hasNextPage]);
or 조건으로 하나라도 해당되는 데이터를 불러온 후 일치하는 개수가 많은 순서대로 정렬
예상 되는 문제점 : 일치하는 개수가 가장 많은 것이 뒷순서에 있을 경우 정렬이 정상적으로 이뤄지지 않음…