📖

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

2024/03/26に公開

参考

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