📖

Firestore のクエリがゴミ過ぎるけど、ワンチャン何とかなるかも

2024/03/26に公開
2

後書き

既に Firestore のクエリは大幅に改善されていますので
最大10個のクエリに対応されています。
その結果、今ではほぼ誤りです。
過去にそんな状況あったなぁくらいに思って見てもらえると良いかなと思います。

参考

https://stackoverflow.com/questions/68166318/the-initial-orderby-field-fieldpathid-true00-has-to-be-the-same

先に参考にしたやつを載せておきます。
(結論です)

前置き

Firestore のクエリはマジでゴミ(らしい)です。

自分は他のデータベースを使ったことがほぼないので知らないですが
巷では噂されています。

今回やりたい事

下記の内容をやりたいと思ってましたmm

js
await .db
    .collection('test')
    .where('point', '<=', 1000)
    .where('createdAt', '<', now)
    .orderBy('point', 'desc')
    .get()

ただ、下記のエラーが出ます。

All where filters with an inequality (<, <=, >, or >=) must be on the same field. But you have inequality filters on 'FieldPath([createdAt])' and 'FieldPath([point])'.

不等式(<、<=、>、または>=)を持つすべてのwhereフィルターは同じフィールド上になければなりません。しかし、'FieldPath([createdAt])'と'FieldPath([point])'に不等式フィルタがあります。

何が厄介なのかというと
複合クエリを作成することもできない点です。

大体のクエリは複合クエリを設定すると解決するんですが
なぜかできないっぽい(理由は知らん)

解決策

厳密には完璧な解決策ではないんですが
まぁ、許容範囲内かなと思われる解決策を提示しますね。

await db
    .collection('test')
    .where('point', '<=', 1000)
    .orderBy('point', 'desc')
    .orderBy('createdAt', 'desc')
    .get()

上記のコードで複合クエリが作成可能なのでこれで作ってしまって
あとは、取得できたデータを精査していくって感じ。

1つ目:
>> 100pt
>> 2024年

2つ目:
>> 100pt
>> 1990年

3つ目:
>> 80pt
>> 2090年

4つ目:
>> 80pt
>> 2050年

あとは自分で調理する必要がある。

仮に今日のデータ以降が必要とかになると大変だから
先にポイントの状況で精査するみたいな感じかな。ここで言うと。

全部 firestore で捌いてくれって感じ。
ただ、noSQLだから無理なんだろうなぁ。
天才エンジニアの集団でも無理か。

Discussion