Cloud Firestore の endAtDocument がややこし過ぎた

2023/05/29に公開

チャットなんかで毎回データを全て取得するのはよく無さそうだけど
どうしたら良いのか分からない...。

ってお悩みのあなたへ!

こちらの動画をご覧くださいmm

https://www.youtube.com/watch?v=poqTHxtDXwU

チャット

例えば、チャットで最新のデータを20個取得したとします。

ただ、チャットであればリアルタイム更新がしたいですよね。
ということで、snapshotsを使用します。

ここで注意。

snapshots はどのデータを監視するべきでしょうか?

(...)

答えは、場合による。です。

wwwww

まぁ、そらそうなんだけど、
一般的な話をしてくれって事だと思うので、
一般的なことを伝えると

・新しく作成されたデータ
・更新されたデータ

のはずよね。

例えば、緑色のSNSとかだと
チャットを送信したり送信されたら
勝手にメッセージが届くよね。

あれは、新しく作成されたデータのはず

また、24時間以内のデータなら
「送信取消」ってのがあるよね。

これは多分、更新されたデータのはず。

これら2つを snapshots で監視をして
UIに反映させられたらこちらの勝ちって事だと思う。

ということで、それらをどうするべきか考えよう。

先に結論コレが正解↓

db
   .collection('chats')
   .orderBy('createdAt', descending: true)
   .endAtDocument(lastDoc!)
   .snapshots().listen((value){
     // 監視後の処理
   })

descending が true って事は降順よね。
例を挙げると、こんな感じで最新順になるって事。

例)
12/30
12/29
12/28

で endAtDocument 処理が何をするのか?
ですよね。

例えば、上記の例で言うと

12/30 のドキュメントを基準に監視したとします。

12/31 のドキュメントが作成
→ 検知します。

12/27 のドキュメントが作成
→ 反応無し

なので、descending == true の時は endAtDocument が良さそうです。

descending が false の場合は??

この場合はまず取得するデータの順番はこうなります

例)
12/28
12/29
12/30

(...)

さっきと逆ですね。

では、この状態でさっきと同じように
12/30 を基準として endAtDocument を使って snapshots を発火させるとどうなるのか?

12/31 のドキュメントを追加
→ 反応無し

12/27 のドキュメントを追加
→ 検知します。

と言うことで、さっきと真逆の反応のようです。

謎ですね・・・。
普通によく分からん。でもこう言うもんだろと思って無理やり暗記します。

descending == false の場合でも・・・

最新のデータを検知したいですよね。

と言うことで、ちょっとだけ探ってみると、
startAtDocument ってのが見当たりました。

何となく対照的だし上手く行けそうな気がする・・・

descending == false の場合だから取得するデータの順番は下記の通り。

例)
12/28
12/29
12/30

では、実際に
12/30 を基準として startAtDocument と snapshots を使って監視すると、、、

12/31 のドキュメントを追加
→ 検知します。

12/27 のドキュメントを追加
→ 反応無し

どうやら上手く行ったようですね。

まとめ

descending == true / false に応じて
startAtDocument , endAtDocument を使い分ける必要性がありそう。

Discussion