Firestore で IN query が使えるようになったので試してみた

FirestoreではSQLでいうIN句が使えなかったのですが、11月のアップデートで使えるようになっていたので試してみました。

広告

whereIn()

いわゆるINです。
サンプルデータを作成してgetしてみます。

【サンプルデータ】
collection: shops
[shop1]
-name: “店1”
-address: “東区”
[shop2]
-name: “店2”
-address: “南区”
[shop3]
-name: “店3”
-address: “北区”
[shop4]
-name: “店4”
-address: “東区”

addressが”東区”と”南区”のデータを取得したいと思います。

db.collection("shops")
    .whereIn("address", listOf("東区", "南区"))
    .orderBy("name")
    .get()
    .addOnSuccessListener { querySnapshot ->
        val items = mutableListOf<String>()
        querySnapshot.documents.forEach {
            items.add("${it.get("name")} (${it.get("address")})")
        }
        val adapter = ArrayAdapter(activity!!, android.R.layout.simple_list_item_1, items)
        view?.home_list?.adapter = adapter
    }

実行結果

firestore in query result
addressが”東区”と”南区”のデータが取得できました。

whereArrayContainsAny()

whereInと同時に追加されたqueryです。
arrayフィールドに対して INで絞り込む感じです。
上記のサンプルデータにarrayフィールドを追加します。

【サンプルデータ】
collection: shops
[shop1]
-name: “店1”
-address: “東区”
-items:
--[0]”いちご”
--[1]”メロン”

[shop2]
-name: “店2”
-address: “南区”
-items:
--[0]”バナナ”
--[1]”みかん”
--[2]”スイカ”

[shop3]
-name: “店3”
-address: “北区”
-items:
--[0]”スイカ”
--[1]”メロン”

[shop4]
-name: “店4”
-address: “東区”
-items:
--[0]”バナナ”
--[1]”いちご”
--[2]”みかん”

itemsに”スイカ”と”メロン”が含まれるデータを取得したいと思います。

db.collection("shops")
    .whereArrayContainsAny("items", listOf("スイカ", "メロン"))
    .orderBy("name")
    .get()
    .addOnSuccessListener { querySnapshot ->
        val items = mutableListOf<String>()
        querySnapshot.documents.forEach {
            items.add("${it.get("name")} (${it.get("items")})")
        }
        val adapter = ArrayAdapter(activity!!, android.R.layout.simple_list_item_1, items)
        view?.home_list?.adapter = adapter
    }

実行結果

firestore whereArrayContainsAny result
itemsに”スイカ”と”メロン”が含まれるデータが取得できました。

さいごに

INが使えるようになって使い勝手がよくなりましたが、残念ながらwhereIn()も whereArrayContainsAny() もqueryに1つしか含めることができません。
不便ではありますが、データの持ち方を工夫すれば何とかなるような希望が見えてきました。