Firestore에 INQuery가 지원되었으므로 SDK, Ballcap에서 시도해보십시오.

13652 단어 FirebaseFirestore

이 기사에 대하여



Firestore에서 마침내 IN 절이 지원되었습니다

Firestore에서는 던질 수 없는 Query를 Algolia에 맡기는 경우는 있을 것 같습니다만,
이번 갱신에 의해 OR 검색에 대해서는 Algolia에 의지하지 않아도 Firestore로 완결해 할 수 있을 것 같네요! (제한 내용에 따라 )

그래서 이번에는 SDK, Firestore의 래퍼 라이브러리 인 Ballcap 각각에서 시도한 내용과 IN 절의 제한에 대해 써 보았습니다

전제



Firestore에서 MoviesCollection을 준비하고,
여러 Document가 MoviesCollection에 들어있는 상태를 만들고 있습니다.

전체적인 Path 이미지는 이쪽/movies/{movieId}


각 Document의 데이터 내용


Ballcap 사용의 경우에 대해서도 이번 기사에서 접하기 위해 Model에 대해서
import Ballcap

struct Movies: Codable, Equatable, Modelable {
    var name: String = ""
    var category: [String] = []
    var tag: String = ""
}

IN Query



tagField에 new 또는 recommend가 존재하는 Document를 취득

SDK
db.collection("movies")
    .whereField("tag", in: ["new", "recommend"])
    .addSnapshotListener { (querySnapshot, error) in
        if let error = error {
            print(error)
        }
        if let documents = querySnapshot?.documents {
            for doc in documents {
                print("data:\(doc.data())")
            }
        }
}

Ballcap
Document<Movies>
    .where("tag", in: ["new", "recommend"])
    .dataSource().onCompleted { (_, movies) in
        for movie  in movies {
            print("movie:\(movie.data?.name)")
        }
}.get()

ArrayContainAny Query



categoryField에 horror 또는 thriller가 존재하는 Document를 취득
SDK
db.collection("movies")
    .whereField("category", arrayContainsAny: ["horror", "thriller"])
    .addSnapshotListener { (querySnapshot, error) in
        if let error = error {
            print(error)
        }
        if let documents = querySnapshot?.documents {
            for doc in documents {
                print("doc:\(doc.data())")
            }
        }
}

Ballcap
Document<Movies>
    .where("category", arrayContainsAny: ["horror", "thriller"])
    .dataSource().onCompleted { (_, movies) in
        for movie in movies {
            print("movie:\(movie.data?.name)")
        }
}.get()

제한 정보



IN Query에 대한 제한은 다음 두 가지입니다.現在、クエリでは最大10個の異なる値に制限されています。
// 10件まで!
whereField("number", in: ["1","2","3","4","5","6","7","8","9","10"])
単一のクエリでは、これらのタイプの操作のうち1つのみを使用できます

// 新しくFiledを設けてうまく使えば制限超えれるのでは?もダメ
whereField("number", in: ["1","2","3","4","5","6","7","8","9","10"])
whereField("number2", in: ["11","12","13","14","15","16","17","18","19","20"])

그건 그렇고, 10 건이 넘으면 충돌
reason: 'Invalid Query. 'arrayContainsAny' filters support a maximum of 10 elements in the value array.'
reason: 'Invalid Query. 'in' filters support a maximum of 10 elements in the value array.'

참고



Cloud Firestore에서 IN 쿼리를 지원합니다!

Querying and filtering data

Firestore
↑여기의 갱신 치라 호라미테루와 릴리스 발표전에 눈치채거나 합니다

사용한 라이브러리



Ballcap-iOS

여담



신세를 지고 있는 라이브러리에 이번 IN구 대응이 merge되었습니다
아직 내용을 쫓을 수는 없지만 Query 근처는 최근에보고 있었기 때문에 타이밍이 좋았습니다!

좋은 웹페이지 즐겨찾기