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