あるWebサイトを作成していますが、手が詰まってしまったので教えてください。
Firebase上にはラーメンの情報が格納されていて、具体的には「味」、「麺の太さ」などがあります。
Webサイト上で、ラーメンの一覧を指定条件で作成日の降順で表示したいと思っております。
ユーザーが指定する条件は以下の通りになります。
味:「全て」、「醤油」、「塩」
麺の太さ:「全て」、「細麺」、「普通」、「太麺」
上記の内容で、Vue.jsでコーディングをするとデータの取得部分のコードは以下のようになりました。
js
1let query = ref 2 .where('azi', '==' , this.azi) 3 .where('hutosa', '==' , this.hutosa) 4 .orderBy('createdAt', 'desc') 5 .get() 6 .then(snapshot => { 7 snapshot.forEach(doc => { 8 this.ramens.push(doc.data()) 9 }) 10 }) 11
Firestoreでインデックスに「味」、「麺の太さ」、「作成日付」を登録してあります。
また、this.azi
とthis.hutosa
に検索内容が含まれています。
上記のコードだと「全て」を選択すると、味も麺の太さも0が入るため、上手く動作しません。
ここで考えたのは何点かあります。
①味や太さを「全て」にしたときに、.where
部分を取り払う。
例えば、味を指定して、太さを「全て」にしたときは下記のように動くようにすれば上手くいくのではないと思いました。
js
1let query = ref 2 .where('azi', '==' , this.azi) 3 .get() 4 以下略
ですが、この場合「味」と「作成日付」のインデックスが必要になってしまいます。すべての組み合わせのインデックスを貼れば、問題は無いのですが検索条件が増えると対応しきれなくなると思っています。
②array-containsを使う
js
1let query = ref 2 .where('azi', 'array-contains' , this.azi == 0 ? [1, 2] : this.azi) 3 .where('hutosa', 'array-contains' , this.hutosa == 0 ? [1, 2, 3] : this.hutosa) 4 .get() 5 以下略
ですが、Firestoreの制約上、array-containsは1つまでと決まっているようで、上記のコードだとエラーになります。
そのほかにも、「全て」を選択したら不等式にすることを考えてみましたが、これもFirestoreの制約上、orderBy部分を不等式に使ったフィールドを最初に使用しなければいけないようなので作成順に出来ませんでした。
もし良い案、解決策があれば回答をお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。