FirebaseのFunctionsからのFirestoreの操作

2021/10/17

サーバサイド開発 ラップ計測

MotoLAPが接続するクラウドサービス、Firebaseを改善しました。


MotoLAPを使って、複数人で同じコースを走行する場合、レースモードを使うと、 クラウド上で、集計して、他の人のタイムを見たり、順位を表示することができます。

MotoLAP送信器のIDで同一コースをはんだんするので、送信器が必要です。

そうなると、送信器がないとレースモードがどんなものなのかわからないので、、体験用としてデモモードがあります。このデモモードは、10分間利用できます。

一度限りだと、レースモードを十分に分かって頂けないかも知れないため、何度でもできるようにしています。何度も行っていると、データが増え続けてしまうので、前回のデータを消す処理をしています。


問題は、削除に時間がかかり、なかなか開始できません。デモモードを開始しつつ、非同期処理で削除しています。今度は、裏で消す際に新しいデータも消してしまう状態になっています。最初の1分ほどのデータは突然消えてしまいます。


一応、釈明を入れていますが、使っている人にとっては、データが消えてしまい、不快なので修正をしました。



以降は、Firestoreの操作メモです。


Firestoreの操作は難しいです。

  • コレクション
  • ドキュメント
  • フィールド
  • サブコレクション
これらの操作は、Create, Update, Write, Deleteなどです。検索は、Whereを使いますが、Whereで検索した後に、Getが必要です。Whereのまま、Deleteとかできません。
Getは非同期処理が必要です。awaitやPromiseで、Get後の処理が必要です。

今回、はまったのは、where().get()でとった、docsを消す処理。
docs.forEach(doc => {})で、1つ1つをdeleteしたかったのですが、doc.delete()ではダメでした。半日近く格闘して、doc.ref.delete()でできました。get()で得たオブジェクトや、db.collection.doc...などで得たオブジェクトの違いをよく分かっていないのが、敗因ですね。

QooQ