firebase 쿼리문

2023. 10. 19. 09:33카테고리 없음

https://firebase.google.com/docs/firestore/query-data/queries?hl=ko

 

Cloud Firestore에서 단순 쿼리 및 복합 쿼리 실행  |  Firebase

Demo Day를 위해 일정을 비워두고 Firebase의 새로운 소식과 기능들을 확인해 보세요. 자세히 알아보기 의견 보내기 Cloud Firestore에서 단순 쿼리 및 복합 쿼리 실행 컬렉션을 사용해 정리하기 내 환경

firebase.google.com

공식문서를 참조하였습니다.

앞서 말해두었다 싶이 파이어베이스에서는 데이터베이스에 데이터들을 저장 할 수 있는 편안한기능들을 제공한다.
하지만 저장만 할 수 있으면 메모장에 적어둔거와 다를 게 없다.
이걸 어떻게 꺼내 올 수 있을까?

바로쿼리문이 있었다. 많은 종류의 쿼리문이 있는데 알아보자.

val cities = db.collection("cities")

val data1 = hashMapOf(
    "name" to "San Francisco",
    "state" to "CA",
    "country" to "USA",
    "capital" to false,
    "population" to 860000,
    "regions" to listOf("west_coast", "norcal"),
)

예시

val query = citiesRef.whereEqualTo("state", "CA")

이 쿼리는 state값이 ca인 문서를 반환한다.
이후 get을 통해 가져온다.

val docRef = db.collection("cities").document("SF")
docRef.get()
    .addOnSuccessListener { document ->
        if (document != null) {
            Log.d(TAG, "DocumentSnapshot data: ${document.data}")
        } else {
            Log.d(TAG, "No such document")
        }
    }
    .addOnFailureListener { exception ->
        Log.d(TAG, "get failed with ", exception)
    }

그러면 log창에 가져온 데이터 들이 뜬다.
나는 가져온 데이터들을 변수로 가져오고싶어!

val docRef = db.collection("cities").document("SF")
docRef.get()
.addOnSuccessListener { document ->
    if (document != null) {
        val data = document.data 
        if (data != null) {
           
            val cityName = data["name"]
            val population = data["population"]
           
        } else {
            Log.d(TAG, "Document is empty")
        }
    } else {
        Log.d(TAG, "No such document")
    }
}
.addOnFailureListener { exception ->
    Log.d(TAG, "get failed with ", exception)
}

 

그냥 변수에 저장하면 끝이다.

이 쿼리문의 종류들을 살펴보자

 

여기서 whereif(조건요청)이라고 보면 편하다.

val query = citiesRef.whereNotEqualTo("name", "San Francisco")

난 name필드에 San Francisco와 일치하지 않는 데이터들을 쓰고싶어 (whereNot== !if)

val query = citiesRef.whereGreaterThan("population", 1000000)
    .whereLessThan("population", 2000000)


난 인구수가 십만보다 많고 이십만보다 작은 문서들을 가져와 쓰고싶어!

여기에 뒤에 OrEqualTo를 추가해주면 whereGreaterThanOrEqualTo, whereLessThanOrEqualTo
-> 십만이상 십만이하이다.


val keyword = "Park"
val query = citiesRef.whereArrayContains("keywords", keyword)

'파크'라는 키워드가 포함된 문서들을 가져오고 싶어!

val query = citiesRef.whereArrayContainsAny("categories", listOf("food", "shopping"))

저 리스트중에 값이 하나라도 포함되는 문서들의 데이터를 가져오고싶어!

val query = citiesRef.orderBy("population")
val query = citiesRef.orderBy("population", Query.Direction.DESCENDING)
val query = citiesRef.orderBy("state").orderBy("population", Query.Direction.DESCENDING)

오름차순 정렬(기본값)
내림차 순 정렬
state에 대해서는 오름차순,population에 대해서는 내림차순(복합정렬)
여기서도 여러가지 정렬이 또 있다.

val query = citiesRef.orderBy("population").startAt(1000000)    
val query = citiesRef.orderBy("population").startAfter(1000000)
val query = citiesRef.orderBy("population").endBefore(1000000)
val query = citiesRef.orderBy("population").endAt(1000000)

차례대로

난 인구수 일정 이상의 문서들을 가져오고 싶어!
난 인구수 일정 초과의 문서들을 가져오고 싶어!
난 인구수 일정 이하의 문서들을 가져오고싶어!
난 인구수 일정 미만의 문서들을 가져오고 싶어!

val query = citiesRef.limit(5)


문서가 너무 많아서 5개만 가져오고싶어!

위에정렬과 조합도가능하다.

citiesRef.orderBy("population", Query.Direction.DESCENDING).limit(5)

인구수5위까지의 문서들을 가져오고싶어!

이 외에도 많이 있지만 이것들이 보편적으로 쓰이는거같다.