Firebase Cloud Firestoreの個人的な経験

みなさんこんにちは! 最近、プロジェクトでFirebaseを使用する機会が増えています。実際にサーバー側を記述せずに行うのは非常に便利です。 フロントエンド側で少し経験を共有したいと思います。 この場合、Angularであるため、公式のAngularFireライブラリが使用されます。 Androidでは、ライブラリとFirebase機能の実装の方が良いように思えます。







Firestoreの詳細



1つ目はオフラインデータです。 AndroidとiOSではデフォルトで有効になっていますが、Webでは無効になっています。これは驚くべきことではありませんでした。 ページがリロードされた後でもデータは更新されなかったはずだったので、今日はこの機能が絶対に好きではありませんでした。 それらはIndexedDBに保存され、手動でクリーニングできますが、firebaseは常にデータベースに接続されています。 すなわち firebaseがまだ初期化されていない場合にのみ、ページの読み込みが開始されたときにのみ、ユーザーが削除(この場合は==クリア)できる可能性はほとんどありません。 したがって、リンクwindow.location.href += '?clear';



クリックして問題を解決しましたwindow.location.href += '?clear';



、次に、そのような優先度スクリプトを実行してメインhtmlファイルのページをリロードした後:







 <body> <script> if (window.location.href.indexOf('?clear') !== -1) { window.history.replaceState(null, null, window.location.pathname); var request = window.indexedDB.deleteDatabase("firestore/[DEFAULT]/your-project/main"); request.onsuccess = function() { console.log("Cleared cache successfully"); }; request.onerror = function() { console.log("Couldn't clear cache"); }; request.onblocked = function() { console.log("Couldn't clear cache due to the operation being blocked"); }; } else { console.log("Missing clear cache"); } </script> <!-- root     --> <root></root> </body>
      
      





動作しますが、同期が恐ろしく実装されているだけなので、主な問題を解決するとは言いません。







第二に、99%のケースでメタデータが必要であるため、コレクションとドキュメントにvalueChanges



を使用しないでください(判明しました)。 いずれかのフィールドでドキュメントのuidを記憶するのはハードコードです。 最良の方法は、Angularの場合のように、 snapshotChanges



をマップとともに使用して、すぐにuidを取得することです。







 this.store.collection<any>("yourCollection", ref => { return ref.orderBy("yourFiled"); }).snapshotChanges() .map(actions => { return actions.map(action => { return { _uid: action.payload.doc.id, ...action.payload.doc.data() }; }); })
      
      





また、コレクションとドキュメントは互いに独立していることに注意してください。 ドキュメントを選択すると、そのサブコレクションは取得されません。これは個別のデータであり、データを表示するためだけに行われます(リアルタイムデータベースとの主な違いの1つ)。

ここで、データベースを設計するときは、1 MBのドキュメントのサイズの制限を考慮してください。 また、大量のデータ(ある種の配列)が存在する可能性がある場合は、それらをサブコレクションに入れる必要があります。







Angularの詳細



重要な質問は、他のフィールドを上書きしないようにドキュメントを保存することでした。 実際、私はそのような解決策を見つけました:







 this.store.collection(collection) .doc(document).ref .set(object, { merge: true }) .then(() => this.showSnackbar(" ")) .catch((error) => { console.log(error); this.showSnackbar("   "); }); // ,  showSnackbar       showSnackbar = (message) => { this.snackbar.open(message, null, { duration: 1000 }); };
      
      





Firebaseリソースを節約するために(オフラインデータの優れた実装のおかげで)、 ReplaySubject



バッファーにデータを保存します。 すべては問題ありませんが、データを更新するときにクリアすることは不可能なので、再作成する必要があります。







 clearDocuments() { this._documents.complete(); this._documents = null; this._documents = new ReplaySubject(); this._refresh.next(true); }
      
      





ここで、_refreshはBehaviorSubject



switchMap



はそれとswitchMap



がいいです。







 this.service._refresh.asObservable() .switchMap(() => { this.items.data = []; return this.service._documents.asObservable(); }) .subscribe(document => { });
      
      





少し個人的な印象



私はRealtime Databaseの経験があり、Firestoreはより高度なリポジトリであると言いますが、欠点もあります。 コンソールでの作業の観点からも(誤ってリアルタイムデータベースのルートノードを削除していた)

Firestoreにはオンラインルールエミュレータがありません(実際にテストをキャンセルした人はいません)。したがって、テストにはfirestore-security-tests



ライブラリを使用します。 get(/databases/$(database)/documents/info/app).data.version



ます。唯一のことは、このタイプのフェッチget(/databases/$(database)/documents/info/app).data.version



サポートされていないことです。

Firestoreのリリースにより、すべてが良くなることを願っています







追加



Firebaseを内部サイトの管理者権限で接続できるのは機能しません(このため、ルールをハードコーディングする必要があります。唯一良いことは、コンソールでアプリケーション証明書の署名を指定できることです)。 Node.jsには解決策がありますが、どういうわけかまだ実装できませんでした。 たぶん誰かがそのような経験を持っていますか?








All Articles