web-dev-qa-db-ja.com

リアルタイム更新を使用しているときにクラウドFirestoreドキュメントが存在するかどうかを確認する方法

これは動作します:

db.collection('users').doc('id').get()
  .then((docSnapshot) => {
    if (docSnapshot.exists) {
      db.collection('users').doc('id')
        .onSnapshot((doc) => {
          // do stuff with the data
        });
    }
  });

...しかし、それは冗長のようです。 doc.existsを試しましたが、うまくいきませんでした。ドキュメントのリアルタイム更新を購読する前に、ドキュメントが存在するかどうかを確認したいだけです。その最初のgetは、dbへのくびれた呼び出しのようです。

もっと良い方法はありますか?

24
Stewart Ellis

最初のアプローチは正しいですが、次のようにドキュメント参照を変数に割り当てる方が冗長になる場合があります。

const usersRef = db.collection('users').doc('id')

usersRef.get()
  .then((docSnapshot) => {
    if (docSnapshot.exists) {
      usersRef.onSnapshot((doc) => {
        // do stuff with the data
      });
    } else {
      usersRef.set({...}) // create the document
    }
});

参照: ドキュメントの取得

50

Angularを使用している場合、 AngularFire パッケージを使用して、オブザーバブルでチェックできます。

import { AngularFirestore, AngularFirestoreDocument } from '@angular/fire/firestore';

constructor(private db: AngularFirestore) {
  const ref: AngularFirestoreDocument<any> = db.doc(`users/id`);
  ref.get().subscribe(snap => {
    if (snap.exists) {
      // ...
    }
  });
}
0
galki