본문 바로가기
Swfit/Database

Firebase firestore 서브컬랙션(subcollection) 편리하게 조회하기

by GGShin 2023. 5. 21.
반응형

Firestore를 사용해보신 분들이라면 아시겠지만 컬랙션(collection)이라는 개념이 있습니다. 

컬랙션 안에 document들이 있고, document에는 서브 컬랙션을 넣어줄 수 있습니다. 서브 컬랙션도 역시나 컬랙션이기 때문에 document들을 넣어 둘 수 있구요. 어떻게 하면 다수의 뎁스를 가진 구조에서 서브 컬랙션 내부 쿼리를 쉽게 할 수 있는지 알아보려 합니다. 

 

제가 Firestore를 사용하며 가진 고민이 몇가지 있었습니다.

 

1. field가 없으면 미완성 document로 구분되어 쿼리가 불가능

Firestore 사용하며 조금 특이하다고 생각했던게, document 만들고 안에 collection 생성되어 있더라도 field 없으면 미완성된 doc으로 여겨져서 코드로 쿼리가 불가능해진다는 점이었습니다. 그래서 특정 docSubcollection내부 docs들을 쿼리하기 위해서 일부러 무의미한 필드를 추가해 두었습니다. 

미완성된 document는 firestore 콘솔에서 document 이름이 옅은 회색에 이탤릭체로 표시됩니다. 이렇게 미완성 document는 getDocument() 혹은 getDocuments() 메소드로 쿼리가 안되고, 그에 따라 내부 collection 접근이 되지 않게 됩니다. 저는 서브 컬랙션 안에 있는 document가 필요했던 터라 임시방편으로 무의미한 필드를 상위 document에 추가해두었었습니다. 아래 사진에 붉은 표시된 부분이 그 부분입니다.

 

2. depth가 깊어질 수록 복잡해 지는 쿼리

이렇게 해서 특정 doc에서 1depth deep 서브 컬렉션 쿼리는 어찌되었든 해낼 수 있었습니다. 그런데 뎁스가 3,4 정도 깊어지는 케이스가 생기게 되었고 이런 경우에 매번 getDocument 사용해서 쿼리를 하자니 코드가 매우 복잡해져서 다른 방법을 찾아야 할 필요성을 느꼈습니다.

게다가 전에는 특정 doc 서브콜랙션에 접근하면 되었는데, 이제는 모든 docs 특정 콜렉션에 담긴 docs 필요해졌습니다. 모든 문서를 불러오는 getDocuments 사용해서는 원하는대로 document 접근이 되지 않는다는 문제도 생기게 되었습니다. 

 

➡️ collectionGroup을 사용하여 두 가지 문제를 해결

검색을 해보아도 알기 어려워 어떻게 해야하나 막막하던 차에 다시 문서를 살펴보기로 했고

collectionGroup이라는 메서드를 사용하면 동일한 이름의 컬렉션 안의 도큐먼트를 모두 쿼리할 수 있다 발견하게 되었습니다.

Firestore를 사용하며 문서를 여러번 보면서도 그냥 넘어갔던 부분이었는데 여기서 도움을 받게 되었습니다. 🥹

 

컬렉션 그룹 쿼리에 대한 설명을 보면 아래와 같이 나와있습니다.

컬렉션 그룹은 ID가 동일한 모든 컬렉션으로 구성됩니다.
기본적으로 쿼리는 데이터베이스의 단일 컬렉션에서 결과를 검색합니다.
단일 컬렉션 대신 컬렉션 그룹에서 문서를 검색하려면 컬렉션 그룹 쿼리를 사용하세요.

 

결국 이름이 같은 컬렉션은 뎁스와 상관없이 같은 그룹으로 분류가 되기 때문에 이런 쿼리가 가능하다고 합니다. 

이렇게 하면 미완성 도큐먼트라고 하더라도 서브컬렉션에 접근할 있다는 의미이고,

그렇다면 무의미한 필드값을 부여해줄 필요도 없다는 의미이기도 했습니다.  

db
 .collectionGroup("landmarks") //collection id 명시
 .whereField("type", isEqualTo: "museum")
 .getDocuments { (snapshot, error) in
    // ...
}

문서에서 제공해준 예제인데, collectionGroup에 파라미터로 원하는 collection id를 명시해서 그 안의 documents를 쿼리할 수 있음을 알 수 있습니다.


참고자료

반응형

'Swfit > Database' 카테고리의 다른 글

Supabase PostgreSQL custom function 사용하기  (2) 2024.01.13
CoreData 사용하기  (0) 2023.01.09